简介
所谓模版方法模式,即定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
书中实例
对于小菜来说,最可惜的事莫过于答题时解出了答案,但题却抄错了。对于大家来说,最搞笑的事莫过于亲眼目睹了他的逗鱼时刻。其实有一种方法不用抄题,那就是模版方法模式
模版方法模式实现程序
//试题类
class TestPaper
{
//试题1
public void TestQuestion1()
{
Console.WriteLine("1+1的结果可能是[] a.两个鸡爪 b.两根冰棍 c.啥也没有 d.这题出的没水平 ");
Console.WriteLine("答案: " + Answer1());
}
protected virtual string Answer1()
{
return "";
}
//...其他题目相同,略过
}
//A的答案
class TestPaperA : TestPaper
{
protected override string Answer1()
{
return "b";
}
}
//B的答案
class TestPaperB : TestPaper
{
protected override string Answer1()
{
return "c";
}
}
//客户端
class Program
{
static void Main(string[] args)
{
Console.WriteLine("A的试卷: ");
TestPaper studnetA = new TestPaperA();
studnetA.TestQuestion1();
Console.WriteLine("B的试卷: ");
TestPaper studnetB = new TestPaperB();
studnetA.TestQuestion1();
Console.Read();
}
}
组成类图
关系介绍
抽象类(AbstractClass)定义了算法的骨架,是具体类(ConcreteClass)的父类。具体类重定义父类的某一个算法的步骤,以实现其特定的算法。
模版方法模式的构成
AbstractClass(抽象类):即抽象模版,定义并实现了一个模版方法。这个模版方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现,顶级逻辑也有可能调用一些具体方法。
ConcreteClass(具体类):实现父类所定义的一个或多个对象方法。每一个抽象类都可以有任意多个具体类与之对应,而每一个具体类都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
模版方法模式的优点
通过把不变行为搬移到父类,取出了子类中的重要代码,模版方法模式提供了一个很好的代码复用平台。
使用场景
当我们遇到一系列步骤构成的过程需要执行。从高层次看他们是相同的,但有些具体步骤的实现可能不同,这时候我们可以考虑使用模版方法模式。