1、概述
定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
2、模式中的角色
- 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
- 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
3、结构图
4、代码实现
// 抽象类
abstract class AbstractClass{
// 一些抽象行为,放到子类去实现
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。
public void TemplateMethod() {
PrimitiveOperation1();
PrimitiveOperation2();
}
}
// 具体类,实现了抽象类中的特定步骤
public class ConcreteClassA extends AbstractClass{
// 与ConcreteClassB中的实现逻辑不同
public override void PrimitiveOperation1(){
...
}
// 与ConcreteClassB中的实现逻辑不同
public override void PrimitiveOperation2() {
...
}
}
public class ConcreteClassB extends AbstractClass{
// 与ConcreteClassA中的实现逻辑不同
public override void PrimitiveOperation1(){
...
}
// 与ConcreteClassA中的实现逻辑不同
public override void PrimitiveOperation2() {
...
}
}
具体调用:
// 声明抽象类
AbstractClass c;
// 用ConcreteClassA实例化c
c = new ConcreteClassA();
c.TemplateMethod();
// 用ConcreteClassB实例化c
c = new ConcreteClassB();
c.TemplateMethod();
5、使用场景
- 在某些类的算法中,用了相同的方法,造成代码的重复。
- 控制子类扩展,子类必须遵守算法规则。
参考文章模板方法模式和设计模式学习笔记-模板方法模式。