(四)模板方法模式

(1)模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类不改变算法结构即可重定义该算法中某些特定步骤。

          分类:行为类型模式

(2)类图:

    

 解释:模板模式就是通过抽象类来定义一个逻辑模板,逻辑框架、逻辑原型,然后将无法决定的部分抽象成抽象类交由子类来实现,一般这些抽象类的调用逻辑还是在抽象类中完成的。这么看来,模板就是定义一个框架,比如盖房子,我们定义一个模板:房子要封闭,有门,有窗等等,但是要什么样的门,什么样的窗,这些并不在模板中描述,这个交给子类来完善,比如门使用防盗门,窗使用北向的窗等等。

(3)举例实现:

      

 (4)模板方法模式的结构

模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:

  1. 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
  2. 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
  3. 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
  4. 抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。

  实现类用来实现细节。抽象类中的模版方法正是通过实现类扩展的方法来完成业务逻辑。只要实现类中的扩展方法通过了单元测试,在模版方法正确的前提下,整体功能一般不会出现大的错误。

(5)模板方法模式使用的场景

  • 容易扩展。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。
  • 便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不同的类中,维护起来是非常不方便的。
  • 比较灵活。因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。但是,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。
  • 在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

(6)使用总结:

 模板方法模式优点

1. 封装不变部分,扩展可变部分:把认为不变的部分封装到父类去实现,可变的部分可以通过继承来继续扩展。

2. 提取公共部分代码,便于维护。

3. 行为由父类控制,子类实现,基本方法时由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。

模板方法模式缺点
模板方法模式颠倒了阅读顺序,我们要想知道子类中模板方法的执行顺序需要去父类中查看,复杂的项目中造成代码阅读的难度。

模板方法模式使用场景
1. 多个子类有共有的方法,并且逻辑基本上相同的时候。

2. 重构,将相同的代码抽取到父类中。 

参考博客:

                 

Java半颗糖
原文地址:https://www.cnblogs.com/2019wxw/p/11750964.html