设计模式——模板方法模式

初识

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

结构

设计模式——模板方法模式

角色:

  • AbstractClass类,实现了一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。
  • ConcreteClass类:实现PrimitiveOperation以完成算法中与特定子类相关的步骤。

应用

生活中类似于模板方法模式的事情有很多,比如,我们印奖状的时候,把奖状的布局,以及一些相同的部分,比如:XX学校,XXXX年度,XXX荣获XX奖。我们会把这些相同的部分设计好,打印出来,而一些不相同的地方,就手写上去。这就是典型的模板方法模式。把不变的行为搬到超类,去除子类中的重复代码体现优势。

设计模式——模板方法模式

实现

class Program
{
   static void Main(string[] args)
   {
       Diploma d;
       d = new DiplomaA();
       d.Reward();

       d = new DiplomaB();
       d.Reward();

       Console.Read();
   }
}

class Diploma//奖状
{
   public void Reward()
   {
       Console.WriteLine("\n奖状布局:");
       Console.WriteLine("相同字样");
       Console.WriteLine(Name());
       Console.WriteLine(Prize());
   }
   
   public virtual string Name()//姓名
   {
       return "";
   }
      
   public virtual string Prize()//奖项
   {
       return "";
   }
}

class DiplomaA:Diploma//奖状A
{
   public override string Name()
   {
        return"nikita";
   }

   public override string Prize()
   {
       return "三好学生奖";
   }
}

class DiplomaB:Diploma//奖状B
{
   public override string Name()
   {
       return "mark";
   }

   public override string Prize()
   {
       return "积极主动奖";
   }
}

打印结果

设计模式——模板方法模式

优点

  • 封装不变部分,扩展可变部分。把认为不变部分的算法封装到父类中实现,而可变部分的则可以通过继承来继续扩展。
  • 提取公共部分代码,便于维护。
  • 行为由父类控制,子类实现。

缺点

  • 按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度。

应用场景

  • 多个子类有共有的方法,并且逻辑基本相同
  • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
  • 重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为。