模板方法
前言
模板方法模式是我们比较常用的设计模式之一,经常经历模板思想,比如CSDN可以创建博客模板,实现博客格式统一, 具体详细格式由具体博客进行定义,所以可以将模板视为抽象基类,将具体博客是为实现抽象的具体类,标准化模板,实现可复用内容,这就形成了我们的模板方法。
一、模板方法
定义一套流程模板,根据需要实现模板中的操作,实现逻辑复用,流程标准化,需要微调要覆盖重写。
二、应用场景
当操作具有固定的流程时,由抽象固定流程步骤,具体步骤交由子类进行实现。
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为被提取出来,集中到一个公共的父类中,从而避免代码重复。
三、角色定义
- 抽象模板(AbstractClass):公共的行为,一般为抽象方法,可以被不同的子类进行重写实现各自的细节。
- 具体实现(ConcreteClass):继承抽象模板方法,并实现非公共行为的实现。
四、代码实现
1.抽象模板
代码如下(示例):
/// <summary>
/// 抽象公共方法
/// </summary>
public abstract class TempLateAbstract
{
public virtual void step1() {
Console.WriteLine("step1");
}
public virtual void step2()
{
Console.WriteLine("step2");
}
public virtual void step3()
{
Console.WriteLine("step3");
}
public virtual void step4()
{
Console.WriteLine("step4");
}
public void TemplateMethod() {
this.step1();
this.step2();
this.step3();
this.step4();
}
}
2.具体实现
代码如下(示例):对私有的操作的实现,公共方法保持不变。
/// <summary>
/// 模板子类的具体实现
/// </summary>
public class ConcreteStep2 : TempLateAbstract {
public override void step2()
{
Console.WriteLine("重写后的Step2");
}
}
public class ConcreteStep3 : TempLateAbstract
{
public override void step3()
{
Console.WriteLine("重写后的Step3");
}
}
3.客户端
代码如下(示例):调用模板方法
/// <summary>
/// 客户端调用
/// </summary>
public class TemplateClienter {
public void Client() {
TempLateAbstract ta = new ConcreteStep2();
ta.TemplateMethod();
ta = new ConcreteStep3();
ta.TemplateMethod();
}
}
4.代码输出
step1
重写后的Step2
step3
step4
step1
step2
重写后的Step3
step4
总结
优点
- 将相同处理逻辑放到抽象父类中,提高代码的可复用性。
- 不同的算法逻辑分离到不同的子类中,提高了代码的可扩展性。
- 复合开闭原则。
缺点
- 每个抽象类都需要一个子类来实现,导致类数量增加,间接增加系统复杂度。
- 由于继承关系自身的缺点,如果父类添加新的抽象方法,则多有子类都要改一遍。