Java设计模式--模板设计模式

一、模版设计模式概述

在阎宏博士的《JAVA与模式》一书中开头是这样描述模板方法(Template Method)模式的:

  模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

通俗的理解:模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现

模板设计模式包含两个部分:

  1. 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
  2. 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

二、案例如下:

需求:计算一个任务执行所需的时间。如:拷贝视频,循环输出

步骤A:先定义抽象类,将统一的部分抽象出来,形成骨架

public abstract class TemplateDesign {
	public long calculateTime(){
		long start = System.currentTimeMillis();
		
		code();
		
		long end = System.currentTimeMillis();
		return end-start;
	}
	
    /**
	 * 此抽象方法由子类实现具体的需求代码
	 */
	public abstract void code();
}

步骤B:定义具体类,继承抽象类,实现具体的需求代码

比如:此处我们做的是拷贝视频

public class TemplateDesignDemo01 extends TemplateDesign{

	@Override
	public void code() {
		try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:/theBigBang Theory/S01E01.mkv"));
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:/theBigBang Theory/S01E01-copy.mkv"))) 
		{
			byte[] flush = new byte[1024*2];
			int len=0;
			while((len=bis.read(flush)) != -1) {
				bos.write(flush);
			}
			bos.flush();
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

在main中测试

public class Test {
	public static void main(String[] args) {
		TemplateDesign td = new TemplateDesignDemo();
		System.out.println(td.calculateTime()+"毫秒");;
	}
}

测试结果如下:

又如,当我们需要修改需求时,如:测试一个简单的循环所需要的时间,则只需要修改子类中的代码即可,非常的灵活方便。

public class TemplateDesignDemo02 extends TemplateDesign{

	@Override
	public void code() {
		for(int i=0; i<10000; i++) {
			System.out.println(i);
		}
	}
}

三、模板设计模式的优缺点:

优点

  1. 使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求
  2. 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

缺点

  1. 如果算法骨架有修改的话,则需要修改抽象类
  2. 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

Java新手,若有错误,欢迎指正!

posted @ 2020-03-28 19:41  跑调大叔!  阅读(194)  评论(0编辑  收藏  举报