1、定义算法
模板方法模式:定义一个操做中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。ide
解释:简单来讲,须要定义一个通用的基类,可是基类中不一样的操做,因而模板方法模式将不一样的操做编写成一个抽象函数放到子类中实现,这样便可完成通用基类的目的。函数
2、UML类图及基本代码this
基本代码:spa
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的实现"); } }
客户端调用及结果:code
AbstractClass ac; ac = new ConcreteClassA(); ac.TemplateMethod(); Console.WriteLine(""); ac = new ConcreteClassB(); ac.TemplateMethod();
3、实例说明blog
平常生活中作菜这件事,虽然作不一样的菜的方式不同,但绝大多数步骤是同样的,本例用炒菠菜和炒白菜做为实例进行说明模板方法模式,基本代码以下:get
public abstract class Vegetable { public void CookVegetable() { Console.WriteLine("烧蔬菜的通常方法:"); this.PoilOil(); this.HeatOil(); PourVegetable(); } public void PoilOil() { Console.WriteLine("倒油"); } public void HeatOil() { Console.WriteLine("把油烧热"); } public abstract void PourVegetable(); } public class Spinach : Vegetable { public override void PourVegetable() { Console.WriteLine("菠菜倒进锅中"); } } public class Cabbage : Vegetable { public override void PourVegetable() { Console.WriteLine("白菜倒进锅中"); } }
客户端调用及运行结果:it
Vegetable sp = new Spinach(); sp.CookVegetable();
4、优缺点及适用场景io
优势:
1)实现了代码复用
2)可以灵活应对子类步骤的变化,符合开放-封闭原则
即:封装不变部分,扩展可变部分。 二、提取公共代码,便于维护。 三、行为由父类控制,子类实现。
缺点:
引入了一个抽象类,使系统逻辑更加复杂。
适用场景:
模板方法模式经过把不变的行为搬移到超类,去除子类中的重复代码来体现其优点。所以凡是能体现此优势的地方均可以使用模板方法模式。