模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。该模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用场景:
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。即“重分解以一般化”,首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3、控制子类扩展。模板方法只在特定点调用“Hook Method(钩子方法)”操作,这样就只允许在这些点进行扩展。
制造悍马:
周三:9.00,我刚刚坐到位置上,打开电脑准备开始干活。
"小三,小三",叫一下其他同事,到会议室开会,老大跑过来吼,带着坏笑,没等大家坐稳,老大就发话了:
“告诉大家一个好消息,昨天终于把XX模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心能做好,我们一定要做好....(此处省略1万字)
动员工作做完了,那就开始压任务了,”这次事件非常紧张,只有一个星期的时间,小三,你负责在一个星期的时间内,把这批10万车模建设完成。
“一个星期?这个...是真做不完,要做分析,做模板,做测试。还要考虑扩展性,稳定性,健壮性。时间实在是太少了”还没等老大说完,我就急了,再不急我的小名就折上了。
”那么这样,制作基本实现,不考虑太多的问题,怎么样?“老大把我的话弹回去了。
唉,领导已经布置任务了,那就开始拼命地做吧,然后就开始准备动手做,在做这个之前先介绍一下我们的公司
模板方法模式的缺点:
1.
====================================================================
以下是我自己的实现:
public class H1 extends HummerModel {
/***
* 要按下喇叭
*/
private boolean alarmFlag = true;
@Override
protected void start() {
System.out.println("悍马H1发动");
}
@Override
protected void stop() {
System.out.println("悍马H1停车");
}
@Override
protected void alarm() {
System.out.println("悍马H1鸣笛");
}
@Override
protected void engineBoom() {
System.out.println("悍马H1引擎声音是这样在。。。");
}
protected boolean isAlarm() {
return this.alarmFlag;
}
public void setAlarm(boolean isAlarm) {
this.alarmFlag = isAlarm;
}
}
public abstract class HummerModel {
protected abstract void start();
protected abstract void stop();
/***
* 喇叭会出声音,是滴滴叫,还是哔哔叫
*/
protected abstract void alarm();
/***
* 引擎会轰隆隆的响
*/
protected abstract void engineBoom();
final public void run() {
this.start();
this.engineBoom();
if (this.isAlarm()) {
this.alarm();
}
this.stop();
}
/**
* 钩子方法, 默认喇叭会响
*
* @return
*/
protected boolean isAlarm() {
return true;
}
}
</pre><pre class="java" name="code">public class H2 extends HummerModel {
@Override
protected void start() {
System.out.println("悍马H2发动");
}
@Override
protected void stop() {
System.out.println("悍马H2停车");
}
@Override
protected void alarm() {
System.out.println("悍马H2鸣笛");
}
@Override
protected void engineBoom() {
System.out.println("悍马H2引擎声音是这样在。。。");
}
@Override
public boolean isAlarm() {
return false;
}
}
H1型号的悍马
H1悍马是否需要喇叭声响0不需要,1需要
1
悍马H1发动
悍马H1引擎声音是这样在。。。
悍马H1鸣笛
悍马H1停车
----H2型号的悍马---
悍马H2发动
悍马H2引擎声音是这样在。。。
悍马H2停车
====== 啦啦啦,由于在父类中,我将isAlarm()方法的访问权限设置成了private 固,子类重写不了父类的方法。