一,概述
这是写的第二篇Java设计模式的解析了,不过与其说是解析,不如说是自己写的一个Demo,一篇个人笔记。
二,对模板方法模式的一些个人理解
模板方法模式是结构最简单的行为型模式,有时,我们完成一件事情时次序是固定的,只有有些步骤确实变化的。比如,当我们去银行办业务时,就是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()方法,结果如下:
排队取号
我来银行取钱
为工作人员评价打分
三,优缺点
优点:1,在父类中将总的具体步骤定义好,由子类实现细节。子类不会更改父类的算法结构。2,实现代码复用。3,很好的体现了开闭原则。
缺点:不同的实现都需要定义一个子类,如果实现过多,系统会过于庞大的,设计会过于复杂。但也体现了“单一职责原则”。
四,总结
少年,记住,今天是Java23种设计模式中的第二种设计模式,努力吧,将那些常用的设计模式掌握。好了,拜拜!