from 大话设计模式
模板方法设计模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法可以使得子类不修改算法结构即可重新定义该算法的特定步骤。
图示:
AbstractClass是一个抽象类,他其中的TemplateMethod定义了方法的算法骨架,primitiveOpertion1和2。算法骨架中的用到的部分操作步骤,这些操作步骤是抽象方法,推迟到子类中来实现,这样骨架算法没有变化,算法中的部分操作方法会被子类修改。
concreteClass是具体类,重写abstractClass中的primitiveOperation方法,这样达到了修改骨架算法中部分操作方法的目的
代码示例
public abstract class AbstractClass
{
public abstract void PrimiOperation1();
public abstract void PrimiOperation2();
public void TemplateOperation()//这个方法定义了整个算法的骨架。其中中PrimiOperation1,PrimiOperation2
{ //推迟到子类中实现
PrimiOperation1(); //
PrimiOperation2();
Console.WriteLine("从模板抽象类中输出");
}
}
public class ConreteClass1 : AbstractClass//具体类继承抽象类,重新原始操作方法
{
public override void PrimiOperation1()
{
Console.WriteLine("具体类1 的方法1");
}
public override void PrimiOperation2()
{
Console.WriteLine("具体类1 的方法2");
}
}
public class ConreteClass2 : AbstractClass
{
public override void PrimiOperation1()
{
Console.WriteLine("具体类2 的方法1");
}
public override void PrimiOperation2()
{
Console.WriteLine("具体类2 的方法2");
}
}
//客户端调用
AbstractClass ac = new ConreteClass1();
ac.TemplateOperation();
AbstractClass ac2 = new ConreteClass2();
ac2.TemplateOperation();
这样抽象类的中模板方法的操作算法和步骤没有变化,但是每个具体步骤的方法又不一样。这就是模板设计的精髓。
模板方法设计模式是通过把不变的行为迁移到超类中,去除子类中的重复代码,提供了一个很好的代码复用平台,
越到这样的情况可以考虑使用模板方法设计模式:当不变和可变的行为混总在子类中的时候,不变的行为会在子类中多次出现,通过模板方法把这些行为迁移到一个单一的类中,这样就摆脱了重复的不变行为的现象