一、模板方法模式(TemplateMethod)
定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
理解:定义了一个模板结构,推迟到子类中去实现
二、模板方法模式UML图
(1)AbstractClass(抽象类):也是一个抽象模板,定义并实现了模板方法,推迟到子类中去实现
(2)ConcreteClassA:具体的实现父类所定义的一个或多个抽象方法
三、代码实现
AbstractClass抽象类
abstract class AbstractClass
{
public abstract void PrimitiveOperation1(); //一些抽象行为,放到子类去实现
public abstract void PrimitiveOperation2();
public void TemplateMethod() //模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类中实现
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
ConcreteClass类
class ConcreteClassA : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类A方法1实现"); //与ConcreteClassB不同的方法实现
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具体类A方法2实现");
}
}
class ConcreteClassB : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类B方法1实现"); //与ConcreteClassA不同的方法实现
}
public override void PrimitiveOperation2()
{
Console.WriteLine("具体类B方法2实现");
}
}
客户端代码
static void Main(string[] args)
{
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
Console.Read();
}
四、优缺点(网上学到的)
优点
- 提高代码复用性
将相同部分的代码放在抽象的父类中 - 提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。