概念回顾
1. 使用了继承,并肯定了这个继承的意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。
2. 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板来处理。
3. 定义一个操作中的算法的骨架,而将其中的一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。
4. 在抽象父类(抽象模板)中定义虚方法,在子类中实现这个虚方法,通过对抽象父类实例化不同的子类从而调用不同的子类实现方法是模板方法的实现方式,在模板方法中注重的就是模板二字,尽可能把不变行为放在父类模板方法中,也就是包含子类实现父类虚方法的方法。
5. 抽象模板(抽象类),定义并实现了一个模板方法(就是包含自身定义的抽象方法的Public方法),这个模板方法一般是一个具体的方法,他给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
6.子类实现父类所定义的一个或多个抽象方法,每个抽象模板都可以有任意多个子类与之对应,而每一个子类都可以给出这些抽象方法(抽象模板的组成步骤)不同的实现。
7. 模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现他的优势的,提供一个很好的代码复用平台。
8. 当过程从高层次上看是相同的,但有些步骤的实现可能不同,这时候,我们通常就应该要考虑用模板方法模式了
9. 当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方(抽象父类的模板方法),这样就帮助了子类摆脱重复的不变行为的纠缠。
10.模板方法模式十分常用也比较容易理解,通常都会利用其提取公共行为到抽象类中
基础例题
using System; using System.Collections.Generic; using System.Text; namespace 模板方法模式 { class Program { static void Main(string[] args) { AbstractClass c; c = new ConcreteClassA(); c.TemplateMethod(); c = new ConcreteClassB(); c.TemplateMethod(); Console.Read(); } } abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine(""); } } class ConcreteClassA : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类A方法1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类A方法2实现"); } } class ConcreteClassB : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类B方法1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类B方法2实现"); } } }