软件设计模式学习(二十六)模板方法模式


模板方法是结构最简单的行为型设计模式,在抽象类中定义了一个称为模板方法的方法,在这个方法中定义其余基本方法的执行步骤,而基本方法的实现能够放在抽象类,也能够放在其子类java


模式动机

现实生活中不少事情的完成过程都包含几个基本步骤,例如请客吃饭,不管吃什么,通常都包含点单、吃东西、买单几个步骤,到底吃什么则具体状况具体分析,在实际环境中由用户动态决定。算法

既然这几个步骤的次序是固定的,因而咱们建立一个新的方法叫“请客”,在其中调用了点单、吃东西和买单,同时指定它们的执行次序,咱们称这个“请客”为模板方法,“点单”、“吃东西”、“买单”都是“请客”过程当中的一个步骤,它们称为基本方法。其中“吃东西”能够有多种吃法,如吃饭、吃面条、吃烧烤,所以须要提供不一样的“吃东西”方法的实现。设计模式

假设用代码实现上述方法,咱们能够把相同代码放在父类,如“点单”和“买单”,而将不一样方法实现放在不一样的子类,如“吃东西”,这样一来提升了代码的复用性,还能够利用面向对象的多态性,这就是模板方法模式的模式动机。设计


模式定义

定义一个操做中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类能够不改变一个算法的结构便可从新定义该算法的某些特定步骤code

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.对象


模式分析

模板方法模式是基于继承的代码复用基本技术,先在抽象类的模板方法中指定执行步骤,将相同步骤对应的方法在抽象父类中实现,而不一样的步骤只在抽象父类中进行声明。因为面向对象的多态性,子类中定义的方法将覆盖父类中定义的方法,所以程序运行时,具体子类的基本方法将覆盖父类中定义的基本方法,实现特定的算法。blog

不过,虽说子类覆盖了父类的方法实现业务逻辑,但其实是由父类来控制整个过程,即子类不须要调用父类,而经过父类来调用子类。继承

由此得模式结构类图以下:同步

抽象类(AbstractClass)中定义一系列基本操做(primitiveOperation),这些基本操做能够是具体的,也能够是抽象的,每个基本操做对应算法的一个步骤,在其子类中能够重定义并实现一个算法的各个步骤。同时在抽象类中实现了一个模板方法(templateMethod),用于定义一个算法的骨架,调用基本操做。it

具体子类(ConcreteClass)用于实如今父类中定义的抽象基本操做以完成子类特定算法的步骤,也能够覆盖在父类中实现的具体基本操做。

基本方法是实现各个步骤的方法,是模板方法的组成部分,基本方法又能够分为三种:

  • 抽象方法

    一个抽象方法由抽象类声明,由其具体子类实现

  • 具体方法

    一个具体方法由一个抽象类或具体类声明并实现,其子类能够进行覆盖

  • 钩子方法

    一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。一般在父类中给出的实现是一个空实现,做为该方法的默认实现,固然也能够提升一个非空的默认实现。

    钩子方法有两类,一类是能够控制具体步骤的执行,好比说咱们但愿在不一样条件下执行模板方法中的不一样步骤,就能够定义一个返回类型为布尔值的钩子方法,用于进行条件判断,若是条件知足则执行某一步骤,不然某一步骤不执行

    public void template() {
        open();
        display();
        if(isPrint()) {
            print();
        }
    }
    
    public boolean isPrint(){
        return true;
    }

    若是不但愿方法执行,能够在其子类在覆盖钩子方法,修改返回值便可。

    还有一类钩子方法是实现体为空的具体方法,子类根据须要覆盖或继承它们,与抽象方法相比,钩子方法的好处在于若是没有覆盖父类中定义的抽象方法,编译仍能够经过。


模式优缺点

模板方法模式的优势:

  • 能够在一个类中形式化地定义算法,而由它的子类实现细节的处理
  • 模板方法模式是一种代码复用的基本技术,在类库设计中尤为重要,它提取类库中的公共行为,将公共行为放在父类,经过子类来实现不一样的行为
  • 经过一个父类调用其子类的操做,经过对子类的扩展增长新的行为,符合开闭原则

模板方法模式的缺点:

  • 每一个不一样的实现都须要定义一个子类,将会致使类的个数增长
相关文章
相关标签/搜索