学无止境,精益求精
十年河东,十年河西,莫欺少年穷
今天一起探讨模板模式,如下:
一、概念
上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法《深浅复制》,创建新的对象,免去了初始化的过程。模板方法模式也特别会“偷工减料”,把不变的行为搬移到超类,去除子类中的反复代码,将代码的复用优势展现的淋漓尽致。它为我们提供了特定的结构和样式,我们仅仅需关心填充数据内容就好,省心啊~
以下让我们来看一下它的准确定义:
模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构就可以重定义该算法的某些特定的步骤。
二、UML图
抽象类(AbstractClass):
1)定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。2)定义并实现了一个模板方法,这个模板方法通常是一个详细的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在对应的抽象操作中,推迟到子类实现。
详细类(ConcreteClass):
1)实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑在组成步骤。
2)每个抽象模板角色都能够有随意多个详细模板角色与之相应,而每个详细模板角色都能够给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不同样。
三、代码解析
namespace TemplateMethod { class Program { static void Main(string[] args) { AbstractClass A = new ConcreteClassA(); A.TemplateMethod(); AbstractClass B = new ConcreteClassB(); B.TemplateMethod(); Console.ReadKey(); } } public 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实现"); } } }
总结:
(1)模板方法模式是通过把不变行为搬移到超类,取出子类中的重复代码来体现它的优势。
(2)模板方式模式就是提供一个很好的代码复用平台。
(3)当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
@陈卧龙的博客