设计模式-模板方法

2020-03-27  本文已影响0人  奔向学霸的路上

模板方法顾名思义将一些成型的、固定的定义为模板。

下面我们来设想一个创景:人需要洗漱、吃饭、睡觉,我们可以把这些流程定义为一个模板;但是pate喜欢用肥皂洗脸,lili喜欢用洗面奶洗脸,这又是每个人不同的洗脸习惯;除此之外,假设angle今天出去跟朋友玩的比较兴奋,她不打算睡觉。

实现:

image

代码


/**

* 人行为的模板方法

*/

public abstract class PersonBusiness {

    protected void templateMethod(){

        wash();

        eat();

        if (doExcited()){

            sleep();

        }

    }

    protected abstract void wash();

    protected void eat(){

        System.out.println("人需要吃饭");

    }

    protected void sleep(){

        System.out.println("人需要睡觉");

    }

    /**

     * 是否很兴奋

     * @return

     */

    protected boolean doExcited()

    {

        return false;

    }

}


/**

* 具体某个人的行为-pate

*/

public class Pate extends PersonBusiness{

    @Override

    protected void wash() {

        System.out.println("pate喜欢用肥皂洗脸");

    }

}


/**

* 具体某个人的行为-lili

*/

public class Lili extends PersonBusiness {

    @Override

    protected void wash() {

        System.out.println("lili喜欢用洗面奶洗脸");

    }

}


/**

* 具体某个人的行为-angel

*/

public class Angel extends PersonBusiness {

    @Override

    protected void wash() {

        System.out.println("angel喜欢用洗面奶洗脸");

    }

    @Override

    protected boolean doExcited(){

        return true;

    }

}

模板方法模式的结构

模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。

模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。

模板方法模式中的方法

模板方法中的方法可以分为两大类:模板方法和基本方法。

模板方法

一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。

一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。

对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#templateMethod

基本方法

基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

抽象方法

一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。

对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#wash

具体方法

一个具体方法由抽象类声明并实现,而子类并不实现或置换。

对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#eat,com.example.leanspringboot.business.impl.PersonBusiness#sleep

钩子方法

一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。

需要注意的是,钩子方法默认以do开头

对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#doExcited

上一篇 下一篇

猜你喜欢

热点阅读