3.10.1 模式意图:
在系统有一些按照指定步骤执行的操作,这时如果将对应步骤的操作细节写在一起,势必会造成耦合度增加 ,不利于扩展,这时可以使用模板方法模式,抽象其中的顺序步骤,将具体的操作细节留到对应的子类中。
3.10.2 模式概念:
它属于行为型模式,定义一个操作中的算法骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的同时,重新定义该算法的某些特定步骤。
3.10.3 模式元素:
- 模板抽象(Template)
- 模板细节(ConcreteTemplate)
3.10.4 代码示例:
A.模板抽象类
public abstract class Template
{
public void TemplateMethod()
{
StepOne();
StepTwo();
StepThree();
}
protected abstract void StepOne();
protected abstract void StepTwo();
protected abstract void StepThree();
}
B.模板实现类
public class ConcreteTemplate : Template
{
protected override void StepOne()
{
Debug.Log($"{nameof(StepOne)}:打开冰箱门");
}
protected override void StepTwo()
{
Debug.Log($"{nameof(StepOne)}:大象塞进去");
}
protected override void StepThree()
{
Debug.Log($"{nameof(StepOne)}:冰箱门关上");
}
}
示例代码调用
void UnitTest()
{
Template template = new ConcreteTemplate();
template.TemplateMethod();
}
打印日志
3.10.5 写法对比:
略
3.10.6 模式分析:
模板方法抽象出对应操作步骤,使其操作抽象与操作细节分离,利于后期需求的变动,符合开闭原则。模板方法主要是利用
override
的特点,可以对新增步骤的变动以增量的形式添加,但也要注意随之增加的子类数量,避免因覆盖层级深、子类数量过多反而造成维护困难。
3.10.7 应用场景:
多个子类含有概念一致或执行步骤相同时,可以考虑使用模板方法模式。
3.10.8 小结:
模板方法在实际开发中使用的频率较高,尤其是框架中自动注册、加载、卸载的地方,都会见到模板方法模式的身影。