3-10设计模式之模板方法模式(Template-Method)

3.10.1 模式意图:

在系统有一些按照指定步骤执行的操作,这时如果将对应步骤的操作细节写在一起,势必会造成耦合度增加 ,不利于扩展,这时可以使用模板方法模式,抽象其中的顺序步骤,将具体的操作细节留到对应的子类中。

3.10.2 模式概念:

它属于行为型模式,定义一个操作中的算法骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的同时,重新定义该算法的某些特定步骤。

3.10.3 模式元素:

  • 模板抽象(Template)
  • 模板细节(ConcreteTemplate)

3.10.4 代码示例:

A.模板抽象类

    public abstract class Template
    {
        public void TemplateMethod()
        {
            StepOne();
            StepTwo();
            StepThree();
        }
        protected abstract void StepOne();
        protected abstract void StepTwo();
        protected abstract void StepThree();
    }

B.模板实现类

    public class ConcreteTemplate : Template
    {
        protected override void StepOne()
        {
            Debug.Log($"{nameof(StepOne)}:打开冰箱门");
        }

        protected override void StepTwo()
        {
            Debug.Log($"{nameof(StepOne)}:大象塞进去");
        }

        protected override void StepThree()
        {
            Debug.Log($"{nameof(StepOne)}:冰箱门关上");
        }
    }

示例代码调用

    void UnitTest()
    {
        Template template = new ConcreteTemplate();
        template.TemplateMethod();
    }

打印日志

3.10.5 写法对比:

3.10.6 模式分析:

模板方法抽象出对应操作步骤,使其操作抽象与操作细节分离,利于后期需求的变动,符合开闭原则。模板方法主要是利用override的特点,可以对新增步骤的变动以增量的形式添加,但也要注意随之增加的子类数量,避免因覆盖层级深、子类数量过多反而造成维护困难。

3.10.7 应用场景:

多个子类含有概念一致或执行步骤相同时,可以考虑使用模板方法模式。

3.10.8 小结:

模板方法在实际开发中使用的频率较高,尤其是框架中自动注册、加载、卸载的地方,都会见到模板方法模式的身影。


更多设计模式详见:设计模式全家桶

发表评论