设计模式-行为型-模板方法

模板方法



前言

模板方法模式是我们比较常用的设计模式之一,经常经历模板思想,比如CSDN可以创建博客模板,实现博客格式统一, 具体详细格式由具体博客进行定义,所以可以将模板视为抽象基类,将具体博客是为实现抽象的具体类,标准化模板,实现可复用内容,这就形成了我们的模板方法。


一、模板方法

定义一套流程模板,根据需要实现模板中的操作,实现逻辑复用,流程标准化,需要微调要覆盖重写。

二、应用场景

当操作具有固定的流程时,由抽象固定流程步骤,具体步骤交由子类进行实现。

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  • 各子类中公共的行为被提取出来,集中到一个公共的父类中,从而避免代码重复。

三、角色定义

  1. 抽象模板(AbstractClass):公共的行为,一般为抽象方法,可以被不同的子类进行重写实现各自的细节。
  2. 具体实现(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

总结

优点

  • 将相同处理逻辑放到抽象父类中,提高代码的可复用性。
  • 不同的算法逻辑分离到不同的子类中,提高了代码的可扩展性。
  • 复合开闭原则。

缺点

  • 每个抽象类都需要一个子类来实现,导致类数量增加,间接增加系统复杂度。
  • 由于继承关系自身的缺点,如果父类添加新的抽象方法,则多有子类都要改一遍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenny@chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值