C# 设计模式系列教程-模板方法模式

2019-12-30 12:35:01刘景俊
模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码,子类实现算法的某些细节,有助于算法的扩展。  

1. 概述

  定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。

2. 模式中的角色

  2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。

  2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

3. 模式解读

  3.1 模板方法类图

C#,设计模式,模板方法模式

  3.2 模板方法模式代码实现


 /// <summary>
 /// 抽象类
 /// </summary>
 public abstract class AbstractClass
 {
  // 一些抽象行为,放到子类去实现
  public abstract void PrimitiveOperation1();
  public abstract void PrimitiveOperation2();

  /// <summary>
  /// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。
  /// </summary>
  public void TemplateMethod()
  {
   PrimitiveOperation1();
   PrimitiveOperation2();
   Console.WriteLine("Done the method.");
  }
 }

 /// <summary>
 /// 具体类,实现了抽象类中的特定步骤
 /// </summary>
 public class ConcreteClassA : AbstractClass
 {
  /// <summary>
  /// 与ConcreteClassB中的实现逻辑不同
  /// </summary>
  public override void PrimitiveOperation1()
  {
   Console.WriteLine("Implement operation 1 in Concreate class A.");
  }

  /// <summary>
  /// 与ConcreteClassB中的实现逻辑不同
  /// </summary>
  public override void PrimitiveOperation2()
  {
   Console.WriteLine("Implement operation 2 in Concreate class A.");
  }
 }

 /// <summary>
 /// 具体类,实现了抽象类中的特定步骤
 /// </summary>
 public class ConcreteClassB : AbstractClass
 {
  /// <summary>
  /// 与ConcreteClassA中的实现逻辑不同
  /// </summary>
  public override void PrimitiveOperation1()
  {
   Console.WriteLine("Implement operation 1 in Concreate class B.");
  }

  /// <summary>
  /// 与ConcreteClassA中的实现逻辑不同
  /// </summary>
  public override void PrimitiveOperation2()
  {
   Console.WriteLine("Implement operation 2 in Concreate class B.");
  }
 }