名称:模板方法模式
意图:定义一个操作中的算法的骨架,而将一些步聚延迟到子类中。TemplateMethod使得子
类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用环境:
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现在代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3、控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
abstractclassAbstractClass
{
publicabstractvoidPrimitiveOperation1();
publicabstractvoidPrimitiveOperation2();
publicvoidTemplateMehod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
classConcreteClassA: AbstractClass
{
publicoverridevoidPrimitiveOperation1()
{
Console.WriteLine("ConcreteClassA.PrimitiveOpration1()");
}
publicoverridevoidPrimitiveOperation2()
{
Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
}
}
classConcreteClassB: AbstractClass
{
publicoverridevoidPrimitiveOperation1()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
}
publicoverridevoidPrimitiveOperation2()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
}
}
调用:
AbstractClassaA = newConcreteClassA();
aA.TemplateMehod();
AbstractClassaB = newConcreteClassB();
aB.TemplateMehod();
输出:
ConcreteClassA.PrimitiveOpration1()
ConcreteClassA.PrimitiveOperation2()
ConcreteClassB.PrimitiveOperation1()
ConcreteClassB.PrimitiveOperation2()