Java设计模式之模板(template)方法模式

2018-10-26  本文已影响1人  小小的Jobs

转载    1.对模板方法模式的一些个人理解

模板方法模式是结构最简单的行为型模式,有时,我们完成一件事情时次序是固定的,只有有些步骤确实变化的。比如,当我们去银行办业务时,就是a排队取号 b办具体业务(取钱) c对工作人员评价 三个步骤,而第二个步骤是不固定的。这种情况下,使用模板方法设计模式就优势明显了。我们只要在抽象方法中定义好完成这么一件事情的骨架,将具体步骤自己实现,而将不固定的部分暴露给子类实现即可,也就是将一些步骤延迟到子类中实现。子类不能改变父类的算法结构,只能是重新定义父类的某些步骤。贴代码吧,直观一点:

    package com.bighuan.template;

    /**

    * 设计模式之模板方法模式Demo

    *

    * @author bighuan 去银行办理业务的步骤 1,排队取号 2,办理业务 3,为工作人员评分

    */

    public abstract class BankTemplate {

    /**

    * 排队取号

    */

    public final void getNum() {

    System.out.println("排队取号");

    }

    /**

    * 办理具体业务定义为抽象方法,供子类实现

    */

    public abstract void exeTask();

    /**

    * 评价

    */

    public final void evaluate() {

    System.out.println("为工作人员评价打分");

    }

    /**

    * 去银行办理业务所有步骤,整套流程

    */

    public final void process() {

    getNum();

    exeTask();

    evaluate();

    }

    }

在去银行办理业务的抽象模板类中,我们将排队取号和评价等具体方法实现,而将办理业务的核心流程定义为一个抽象的方法exeTask()方法。当子类继承BankTemplate是就必须实现这个方法了,我们就可以在这个方法中做一些取钱啊存款啊等操作。给个例子呗!好的,虽然自己卡里没什么钱,写个取钱的方法还是可以的。如下:

    package com.bighuan.template;

    import org.junit.Test;

    public class WithdrawMoney extends BankTemplate {

    @Override

    public void exeTask() {

    System.out.println("我来银行取钱");

    }

    @Test

    public void test() {

    process();

    }

    }

WithdrawMoney继承BankTemplate抽象类,就必须实现父类的抽象方法,在这里就可以实现办具体的业务了。你可以取钱,也可以存钱,等等。并且办一个业务中的流程是不变的,我们在父类的process()中定义好了。不知道你注意到了没有,父类中那些具体的步骤都用final关键字修饰了,不允许子类重写,子类只能自己实现那个暴露的方法,当然了,子类也是可以扩展一些方法的。由此可见,模板方法模式体现了Java中的”开闭原则”。

运行那个test()方法,结果如下:

    排队取号

    我来银行取钱

    为工作人员评价打分

2.优缺点

优点:1,在父类中将总的具体步骤定义好,由子类实现细节。子类不会更改父类的算法结构。2,实现代码复用。3,很好的体现了开闭原则。

缺点:不同的实现都需要定义一个子类,如果实现过多,系统会过于庞大的,设计会过于复杂。但也体现了“单一职责原则”

转载 原文:https://blog.csdn.net/bighuan/article/details/62940515

上一篇 下一篇

猜你喜欢

热点阅读