模板模式
1、模板模式的动机
- 模板方法是基于类继承的代码复用基本技巧,模板方法将相同的部分放在抽象父类中,将差异性的部分放到子类中去实现,符合 面向对象设计的基本机制之一,多态;
- 模板方法定义一个抽象类将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。 不同的子类可以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。
2、模板模式的定义
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特 定步骤。模板方法是一种类行为型模式
3、模板模式的类结构图
分析如下:
- 模板模式是一种类行为型模式,模式中只存在类的继承,而不存在类的关联关系;
- 模板模式在使用过程中,需要开发出抽象类和具体子类相互协作。抽象类定义了算法的骨架和轮廓,而子类实现了算法的各个步骤。 实现的这些逻辑步骤称为基本方法,负责把这些步骤组合起来的方法叫做模板方法;
- 模板方法的是由具体步骤,抽象步骤以及钩子方法三部分组成;
4、优缺点和适用场景
优点:
- 模板方法抽象类中形式化的定义算法,而由他的子类实现细节的处理;
- 提供代码的复用度;
- 实现了一种反向控制,父类调用子类的实现,通过对子类的扩展增加新的行为;
缺点:
- 每个不同的实现都会建立一个新的类,会导致系统的类不断的增加,会是系统不断庞大;
适用场景:
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;
- 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现;
- 控制子类的扩展
5、实例
例:汽车模型,包含启动,停车;
汽车抽象类:
public abstract class Car {
public void templateMethod() {
start();
stop();
}
protected abstract void stop();
public abstract void start();
}
奥迪汽车:
public class AudiCar extends Car {
protected void stop() {
System.out.println("奥迪汽车,停车");
}
public void start() {
System.out.println("奥迪汽车,启动");
}
}
大众汽车:
public class VWCar extends Car {
protected void stop() {
System.out.println("大众汽车,停车");
}
public void start() {
System.out.println("大众汽车,启动");
}
}
测试:
public class Test {
public static void main(String[] args) {
Car car = new AudiCar();
Car car1 = new VWCar();
car.templateMethod();
car1.templateMethod();
}
}
6、模式扩展
钩子方法:
- 钩子方法的引入使得子类可以控制父类的行为;
- 最简单的钩子方法就是空方法,也可以在钩子方法中定义一个默认的实现,如果子类不覆盖钩子方法,则执行父类的默认实现代码。
- 比较复杂一点的钩子方法可以对其他方法进行约束,这种钩子方法通常返回一个boolean类型,即返回true或false,用来判断是 否执行某一个基本方法。
- 上一篇 命令模式
- 下一篇 Java的Executor框架和线程池实现原理