• 设计模式(14) 模板方法模式


    模板方法模式

    模板方法模式是面向对象系统中非常朴实的一种模式,体现出面向对象设计中继承和多态的基本特征。在开发应用的过程中,往往会在初期规划一些较粗粒度的算法,而且对参与计算的对象进行抽象,明确算法会使用到哪些方法,每个方法可以提供哪些支持,但此时每个方法本身并没有细化;随着开发过程的展开,我们可能会具体实现每个方法,或者对最初的一些方法进行替换,覆盖上新的内容,这样就在一个相对固定的算法框架下,通过子类(或其他方法)的变化,实现了算法的差异性。

    GOF对模板方法模式的描述为:
    Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method let ssubclasses redefine certain steps of an algorithm without changing the algorithm's structure..
    — Design Patterns : Elements of Reusable Object-Oriented Software

    UML类图:
    模板方法模式 UML类图

    代码示例:

    public abstract class Template
    {
        public abstract void Init();
        public abstract void Start();
        public abstract void End();
    
        public void Process()
        {
            Init();
            Start();
            End();
        }
    }
    
    public class ConcreteProcessor1 : Template
    {
        public override void End()
        {
            Console.WriteLine("Process1 End");
        }
    
        public override void Init()
        {
            Console.WriteLine("Process1 Init");
        }
    
        public override void Start()
        {
            Console.WriteLine("Process1 Start");
        }
    }
    
    public class ConcreteProcessor2 : Template
    {
        public override void End()
        {
            Console.WriteLine("Process2 End");
        }
    
        public override void Init()
        {
            Console.WriteLine("Process2 Init");
        }
    
        public override void Start()
        {
            Console.WriteLine("Process2 Start");
        }        
    }
    

    适用场景

    • 在实现一个算法时,发现其中有些部分非常易变,或者很容易随着运行环境、后续开发的不同产生而很多变化,此时就按照模板方法模式可以把它们抽象出来,供子类完成。
    • 在需要对一系列子类进行约束,要求它们必须实现算法要求的某些方法时,可以采用模板方法模式,便于其他客户程序按照这些方法操作子类。

    优点
    1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

    • 提高代码复用性,将相同部分的代码放在抽象的父类中 ,而将不同的代码放入不同的子类中
    • 提高了扩展性,将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
    • 实现了反向控制,通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制,符合“开闭原则”

    缺点
    每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

    参考书籍:
    王翔著 《设计模式——基于C#的工程化实现及扩展》

  • 相关阅读:
    下载安装ngnix
    微信小程序富文本中的图片大小超出屏幕
    微信小程序跳转(当我们不知道是普通页面还是tabbar)
    查看每年用量最多技术框架
    vue.js--遇到的一些错误
    vue-router(配置子路由--单页面多路由区域操作)
    webpack配置文件--(loader)
    webpack配置(入口出口)
    数组排序
    2021年12种高级UX/UI设计趋势
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/13423680.html
Copyright © 2020-2023  润新知