1. 模式意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中去。 Template Method使得子类可以不改变一个算法的结构即可以重定义该算法的某些特定步骤。
模板方法模式实际上是所有模式中最常用的几个模式之一。
模板方法中的方法可以分为两大类:模板方法(Template Method) 和 基本方法(Primitive Method):
模板方法
{
... ...
基本方法;
基本方法;
... ...
}
模板方法:
一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模板方法一般会在抽象类中定义,并由子类不加以修改地完全继承下来。
基本方法:
基本方法又可以分为三种:抽象方法(Abstract Method),具体方法(Concrete Method),钩子方法(Hook Method):
- 抽象方法:一个抽象方法由抽象类声明,由具体子类实现。
- 具体方法:一个具体方法又抽象类声明并实现,而子类并不实现或置换。
- 钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现,钩子方法通常以do开头。
2. 模式定义
抽象模板(Abstract Class):定义了一个或多个抽象操作(Primitive Method),以便让子类实现;这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。定义并实现了一个模板方法,这个模板方法一般是一个具体方法,它给出一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
具体模板(Concrete Class):实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。
每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
3. 模式实现
3.1 C#实现模板方法
// Template Method pattern -- Structural example
using System;
// "AbstractClass"
abstract class AbstractClass
{
// Methods
abstract public void PrimitiveOperation1();
abstract public void PrimitiveOperation2();
// The Template method
public void TemplateMethod()
{
Console.WriteLine("In AbstractClass.TemplateMethod()");
PrimitiveOperation1();
PrimitiveOperation2();
}
}
// "ConcreteClass"
class ConcreteClass : AbstractClass
{
// Methods
public override void PrimitiveOperation1()
{
Console.WriteLine("Called ConcreteClass.PrimitiveOperation1()");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("Called ConcreteClass.PrimitiveOperation2()");
}
}
/// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main( string[] args )
{
// Create instance and call template method
ConcreteClass c = new ConcreteClass();
c.TemplateMethod();
}
}
4. 模式应用