一、定义
模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
解释:简单来说,需要定义一个通用的基类,但是基类中不同的操作,于是模板方法模式将不同的操作编写成一个抽象函数放到子类中实现,这样即可完成通用基类的目的。
二、UML类图及基本代码
基本代码:
abstractclassAbstractClass
{publicabstractvoidPRimitiveOperation1();publicabstractvoidPrimitiveOperation2();publicvoidTemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("基类的行为");
}
}classConcreteClassA : AbstractClass
{publicoverridevoidPrimitiveOperation1()
{
Console.WriteLine("具体类A方法1的实现");
}publicoverridevoidPrimitiveOperation2()
{
Console.WriteLine("具体类A方法2的实现");
}
}classConcreteClassB : AbstractClass
{publicoverridevoidPrimitiveOperation1()
{
Console.WriteLine("具体类B方法1的实现");
}publicoverridevoidPrimitiveOperation2()
{
Console.WriteLine("具体类B方法2的实现");
}
}
客户端调用及结果:
AbstractClass ac;
ac=newConcreteClassA();
ac.TemplateMethod();
Console.WriteLine("");
ac=newConcreteClassB();
ac.TemplateMethod();
View Code
三、实例说明
日常生活中做菜这件事,虽然做不同的菜的方式不一样,但绝大多数步骤是一样的,本例用炒菠菜和炒白菜作为实例进行说明模板方法模式,基本代码如下:
publicabstractclassVegetable
{publicvoidCookVegetable()
{
Console.WriteLine("烧蔬菜的一般方法:");this.PoilOil();this.HeatOil();
PourVegetable();
}publicvoidPoilOil()
{
Console.WriteLine("倒油");
}publicvoidHeatOil()
{
Console.WriteLine("把油烧热");
}publicabstractvoidPourVegetable();
}publicclassSpinach : Vegetable
{publicoverridevoidPourVegetable()
{
Console.WriteLine("菠菜倒进锅中");
}
}publicclassCabbage : Vegetable
{publicoverridevoidPourVegetable()
{
Console.WriteLine("白菜倒进锅中");
}
}
View Code
客户端调用及运行结果:
Vegetable sp =newSpinach();
sp.CookVegetable();
四、优缺点及适用场景
优点:
1)实现了代码复用
2)能够灵活应对子类步骤的变化,符合开放-封闭原则
缺点:
引入了一个抽象类,使系统逻辑更加复杂。
适用场景:
模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现其优势。因此凡是能体现此优点的地方都可以使用模板方法模式。