概述
- 在模板方法模式中,可以将相同的代码放在父类中,例如将模板方法“请客”以及基本方法“点单”和“买单”的实现放在父类中,而对于基本方法“吃东西”,在父类中只做一个声明,将其具体实现放在不同的子类中,在一个子类中提供“吃面条”的实现,而另一个子类提供“吃满汉全席”的实现。
- 通过使用模板方法模式,一方面提高了代码的复用性,另一方面还可以利用面向对象的多态性,在运行时选择一种具体子类,实现完整的“请客”方法,提高系统的灵活性和可扩展性。
- 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 模板方法模式是一种基于继承的代码复用技术。
- 是一种类行为型模式。
- 学习难度:★★☆☆☆
- 使用频率:★★★☆☆
优缺点
- 优点
- 满足开闭原则,行为父类控制,扩展子类增加相应功能
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护
- 缺点
- 抽象类的模板方法进行了具体的实现。子类抽象方法的实现影响到了父类的行为。增加代码阅读难度
类图
组成角色
- 抽象类(AbstractClass)
- 具体子类(ConcreteClass)
Code Example
抽象类(AbstractClass)
public abstract class DriveCar {
public void openDoor() {
System.out.println("模板共性,打开车门");
}
public void startPower() {
System.out.println("模板共性,开启电源");
}
public void closeDoor() {
System.out.println("模板共性,关闭车门");
}
public abstract void touchPower();
public void run() {
openDoor();
closeDoor();
startPower();
touchPower();
}
}
具体子类(ConcreteClass)
public class ADriver extends DriveCar {
@Override
public void touchPower() {
System.out.println("A师傅,开到80迈!");
}
}
public class BDriver extends DriveCar {
@Override
public void openDoor() {
System.out.println("B师傅是撬开门的!");
}
@Override
public void touchPower() {
System.out.println("B师傅开到了160迈!");
}
}
客户端
public class Template {
public static void main(String[] args) {
ADriver aDriver = new ADriver();
aDriver.run();
System.out.println("============华丽的分割线================");
BDriver bDriver = new BDriver();
bDriver.run();
}
}