设计模式之模板方法模式
模式中的角色:
抽象方法:一个抽象方法由抽象类声明,由具体子类实现。抽象方法以abstract关键字标示。
具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。
钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
/// <summary>
/// 抽象类
/// </summary>
public abstract class AbstractClass
{
// 一些抽象行为,放到子类去实现
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
/// <summary>
/// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。
/// </summary>
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("Done the method.");
}
}
/// <summary>
/// 具体类,实现了抽象类中的特定步骤
/// </summary>
public class ConcreteClassA : AbstractClass
{
/// <summary>
/// 与ConcreteClassB中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation1()
{
Console.WriteLine("Implement operation 1 in Concreate class A.");
}
/// <summary>
/// 与ConcreteClassB中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation2()
{
Console.WriteLine("Implement operation 2 in Concreate class A.");
}
}
/// <summary>
/// 具体类,实现了抽象类中的特定步骤
/// </summary>
public class ConcreteClassB : AbstractClass
{
/// <summary>
/// 与ConcreteClassA中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation1()
{
Console.WriteLine("Implement operation 1 in Concreate class B.");
}
/// <summary>
/// 与ConcreteClassA中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation2()
{
Console.WriteLine("Implement operation 2 in Concreate class B.");
}
}
class Program
{
static void Main(string[] args)
{
// 声明抽象类
AbstractClass c;
// 用ConcreteClassA实例化c
c = new ConcreteClassA();
c.TemplateMethod();
// 用ConcreteClassB实例化c
c = new ConcreteClassB();
c.TemplateMethod();
Console.Read();
}
}
=====================================================================
结束。