1、结构图
2、代码
/******************************************************************
* 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod
* 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
* 适用性:
* 1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
* 2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
* 这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子[OJ93]。
* 首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,
* 用一个调用这些新的操作的模板方法来替换这些不同的代码。
* 3、控制子类扩展。模板方法只在特定点调用“hook”操作(参见效果一节),
* 这样就只允许在这些点进行扩展。
* 适用性:ConcreteClass靠AbstractClass来实现算法中不变的步骤。
* 作者:董怀信
* 日期:2009-06-10
* ****************************************************************/
using System;
namespace DesignPattern.BehavioralPattern
{
/// <summary>
/// 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤。
/// 实现一个模板算法,定义一个算法的骨架。该原语方法不但调用原语操作,
/// 也调用定义在AbstractClass或其他对象中的操作。
/// </summary>
public abstract class AbstractClass
{
public void TemplateMethod()
{
Console.WriteLine("AbstractClass:TemplateMethod Start;");
this.PrimitiveOperation1();
this.PrimitiveOperation2();
Console.WriteLine("AbstractClass:TemplateMethod End;");
}
protected abstract void PrimitiveOperation1();
protected abstract void PrimitiveOperation2();
}
/// <summary>
/// 诗选原语操作以完成算法中与特定子类相关的步骤。
/// </summary>
public class ConcreteClass : AbstractClass
{
protected override void PrimitiveOperation1()
{
Console.WriteLine("ConcreteClass:PrimitiveOperation1();");
}
protected override void PrimitiveOperation2()
{
Console.WriteLine("ConcreteClass:PrimitiveOperation2();");
}
}
/// <summary>
/// 客户测试
/// </summary>
public class Client
{
public void Test()
{
AbstractClass instance = new ConcreteClass();
instance.TemplateMethod();
}
}
}