模板方法模式
定义
模板方法(Template Method)——在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
解释:
从类图上来看,模板方法非常简单,就是一个 继承 关系。
从目的来看,模板方法就是就是将方法的实现延迟到子类中去:
- 同一类相同的方法在父类中实现,不同的方法在子类中实现
- 在抽象类方法中调用一些抽象方法,但这些方法在子类中实现,这个调用抽象方法的方法就叫模板方法
UML
代码
首先定义一个抽象类,包含模板方法和抽象方法
namespace DesignModel.TemplateMethod
{
public abstract class AbstractClass
{
//模板方法
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
}
//抽象方法
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
}
}
然后完成他的一个实现
namespace DesignModel.TemplateMethod
{
public class ConcreteClass : AbstractClass
{
public override void PrimitiveOperation1()
{
Debug.Log("Concrete Operation 1");
}
public override void PrimitiveOperation2()
{
Debug.Log("Concrete Operation 2");
}
}
}
接着在客户端进行简单调用
using DesignModel.TemplateMethod;
public class Client_TemplateMethod : MonoBehaviour
{
void Start ()
{
//实际上应该定义一个参数去传递这个抽象进来,这里简单的直接创建了
AbstractClass concrete = new ConcreteClass();
concrete.TemplateMethod();
}
}
结果
模板方法的应用
优点:
1.抽象类只负责定义一个模板,而不关心实现,符合单一职责原则,迪米特法则
2.具体实现交由子类完成,而调用者并不依赖具体的子类,符合依赖倒置原则
3.当扩展功能时,仅需要新增子类即可,符合开闭原则
缺点:
1.增加了抽象层,增加了系统复杂程度
应用场景:
模板方法通常使用在框架类中,对于一个框架来说,框架只是制定了一系列的规则,具体的实现由用户去定义。
例如在Unity3d中,我们最经常使用的Start,Update等函数,我们只知道Start是每次脚本开始时执行的函数,而Update是脚本每帧执行的函数,我们定义脚本去实现对应的函数就行了。但我们并不需要知道Start和Update是如何被调用的。(实际上Unity是用反射去实现这些机制的)