摘录自《大话设计模式》
第一版代码:
试卷父类代码
学生类代码
客户端代码
仔细看看,两个学生的类里面还是存在相同的东西。比如都有‘base.TestQuestion()’,还有‘Console.WriteLine(" 答案:")’,除了选项的abcd,其他都是重复的。
既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
现在来看看我们最初的试题方法。
我们就改动这里,增加一个虚方法。
其余两个题目也用相同的做法。然后子类就非常简单了,重写虚方法后,把答案填上,其他什么都不用管。因为父类建立了所有重复的模板。
代码结构图
客户端代码需要改动一个小地方,本来是子类变量的声明,改成了父类,这样就可以利用多态性实现代码的复用了
模板方法模式
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式是通过把不变行为搬移到父类,去除子类中的重复代码来体现它的优势。