zoukankan      html  css  js  c++  java
  • 设计模式之模板方法

    模板方法介绍

    模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。

    模板

    模板方法模式建议将算法分解为一系列步骤,然后将这些步骤改为方法,最后在“模板方法”中依次调用这些方法。

    步骤可以是抽象的,也可以有一些默认的实现。为了能够使用算法,客户端需要自行提供子类并实现所有的抽象步骤(有时候还需要重写步骤)。

    模板方法将算法分解为步骤,并允许子类重写这些步骤,而非重写实际的模板方法。

    分解步骤

    1、抽取步骤必须由各个子类来实现;

    2、可选步骤已有一些默认实现,但仍可在需要时进行重写。

    模板方法的结构

    • 1、抽象类

    声明作为算法步骤的方法,以及依次调用它们的实际模板方法。

    算法步骤可以被声明为抽象类,默认提供一些实现。

    • 2、具体类

    实现抽象方法的类,重写所有步骤,但不能重写模板方法自身。

    适合场景

    • 1、当希望客户端扩展某个特定算法步骤,而不是整个算法或其结构时。

    • 2、当多个类的算法除了一些细微不同之处几乎完全一样时。

    实现方式

    1、分析目标算法,确定能否将其分解为多个步骤(从所有子类的角度出发,考虑哪些步骤能够通用,那些步骤各不相同)。

    2、创建抽象基类并声明一个模板方法和代表算法步骤的一系列抽象方法(在模板方法中根据算法结构依次调用相应步骤)。

    对于默认的实现,可以给部分步骤带来好处。同时可以考虑在算法的关键之间添加钩子。

    3、为每个算法变体新建一个具体子类,它必须实现所有的抽象步骤,也可以重写部分可选步骤。

    优点

    1、你可仅允许客户端重写一个大型算法中的特定部分,使得算法其他部分修改对其所造成的影响减小。

    2、可将重复的代码提取到一个超类中。

    缺点

    1、部分客户端会受到算法框架的限制。

    2、会导致违法里氏替换原则,通过子类抑制默认步骤。

    3、模板方法中步骤越多,后期的维护成本会增大。

    Demo

    它在基类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。

    通常使用此模板方法来向框架用户提供通过继承实现的、对标准功能进行扩展的简单方式

    提供的抽象类

    抽象类

    实现抽象类的具体类

    实现抽象类

    客户端和Main方法业务逻辑

    客户端和Main方法

    首先我们可以看到在提供的抽象方法中,有一个模板方法,此方法用于执行基类声明的算法步骤。后面客户端只需要调用此方法就可以完成交给不同子类的业务。

    不同的子类,由于继承相同的抽象类,首先必须实现抽象方法,其次可根据每个子类的业务需求各自来实现某些钩子方法,此方法用于在子类中超长发挥,各自都可以对进行变更,彼此不受影响。最后想要实现的是,我调用同样的方法代码,后面声明实现的两个类会得到不同的显示结果。

    显示的不同结果

    由于1号没有重写钩子方法,2号重写了。所以当在模板方法中调用One()时,1号没有进行任何操作,执行的是抽象类中的空方法,而2号重写了,则输出了重写的方法。

    小寄语

    人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

    原创不易,给个关注。

    我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。

    作者:阿辉
    关注我:微信扫描下面二维码,关注后6T编程资料免费送。
    微信公众号:Andy阿辉
    写一些程序员的所思所想,希望对你有帮助。

    版权声明:本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    A Bug's Life POJ 2492
    First Training
    洛谷----P1162 填涂颜色
    软考知识点梳理--软件测试
    软考知识点梳理--面向对象方法
    软考知识点梳理--国家信息化体系六要素
    软考知识点梳理--电子政务
    软考知识点梳理--激励理论
    软考知识点梳理--承建方项目论证
    软考知识点梳理--项目成本类型
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/15183079.html
Copyright © 2011-2022 走看看