设计模式——模板方法模式
概念
①、什么是模板模式?
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模块方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
简单来说:模块方法模式是通过把不变行为搬移到超类,去除子类的重复代码来体现它的优势。
②、主要解决什么问题
一些通用的方法,却在每一个子类都重写了这一类方法
③、如何解决?
将这些通用算法抽象出来
④、优缺点
优点:
- 提供了一个分号的代码复用平台
- 帮助子类拜托重复的不变行为的纠缠
- 封装不变部分,扩展可变部分
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使系统更加庞大
⑤、 什么时候使用
当不变的和可变的行为在方法的子类实现中混合在一起的时候,(不变的行为就会在子类中重复出现)
图
AbstractClass:是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一一般是一个具体方法,它给出了一个顶级逻辑的骨架,二逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
ConcreteClass:实现父类所定义的一个或多个抽象方法,每一个AbstractClass都可以有任意多个ConcreteClass与之对应而每一个ConcreteClass都可以各处这些抽象方法的不同实现。
代码
AbstractClass类
abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2();//抽象方法放到子类中实现 public void TemplateMethod() //模板方法,给出了逻辑的骨架而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现 { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine(""); } }
ConcreteClass(A B)类
class ConcreteClassA:AbstractClass { public override void PrimitiveOperation1() //与ConcreteClassB方法不同实现 { Console.WriteLine("具体类A方法1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类A方法2实现"); } } class ConcreteClassB:AbstractClass { public override void PrimitiveOperation1()//与ConcreteClassA不同的方法实现 { Console.WriteLine("具体类B方法1实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类B方法2实现"); } }
客户端代码
class Program { static void Main(string[] args) { AbstractClass c; c = new ConcreteClassA(); c.TemplateMethod(); c = new ConcreteClassB(); c.TemplateMethod(); Console.Read(); } }