初识
模板方法模式(TemplateMethod):定义一个算法中的操作框架,而将一些步骤延迟到子类中。使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
结构
角色:
- AbstractClass类,实现了一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤。
- ConcreteClass类:实现PrimitiveOperation以完成算法中与特定子类相关的步骤。
应用
生活中类似于模板方法模式的事情有很多,比如,我们印奖状的时候,把奖状的布局,以及一些相同的部分,比如:XX学校,XXXX年度,XXX荣获XX奖。我们会把这些相同的部分设计好,打印出来,而一些不相同的地方,就手写上去。这就是典型的模板方法模式。把不变的行为搬到超类,去除子类中的重复代码体现优势。
实现
class Program
{
static void Main(string[] args)
{
Diploma d;
d = new DiplomaA();
d.Reward();
d = new DiplomaB();
d.Reward();
Console.Read();
}
}
class Diploma//奖状
{
public void Reward()
{
Console.WriteLine("\n奖状布局:");
Console.WriteLine("相同字样");
Console.WriteLine(Name());
Console.WriteLine(Prize());
}
public virtual string Name()//姓名
{
return "";
}
public virtual string Prize()//奖项
{
return "";
}
}
class DiplomaA:Diploma//奖状A
{
public override string Name()
{
return"nikita";
}
public override string Prize()
{
return "三好学生奖";
}
}
class DiplomaB:Diploma//奖状B
{
public override string Name()
{
return "mark";
}
public override string Prize()
{
return "积极主动奖";
}
}
打印结果
优点
- 封装不变部分,扩展可变部分。把认为不变部分的算法封装到父类中实现,而可变部分的则可以通过继承来继续扩展。
- 提取公共部分代码,便于维护。
- 行为由父类控制,子类实现。
缺点
- 按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度。
应用场景
- 多个子类有共有的方法,并且逻辑基本相同
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
- 重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为。