package com.createtype.desginpatterns.templatemethod;
/**
* @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
* all. Hummer Model是悍马车辆模型的意思,不是悍马美女车模
*/
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();
}
// 钩子方法,默认喇叭是会响的
protected boolean isAlarm() {
return true;
}
}
package com.createtype.desginpatterns.templatemethod;
/**
* @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
* all. H1和H2有什么差别,还真不知道,真没接触过悍马
*/
public class HummerH2Model extends HummerModel {
@Override
protected void alarm() {
System.out.println("悍马H2鸣笛...");
}
@Override
protected void engineBoom() {
System.out.println("悍马H2引擎声音是这样在...");
}
@Override
protected void start() {
System.out.println("悍马H2发动...");
}
@Override
protected void stop() {
System.out.println("悍马H1停车...");
}
// 默认没有喇叭的
@Override
protected boolean isAlarm() {
return false;
}
}
package com.createtype.desginpatterns.templatemethod;
/**
* @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
* all. 悍马车是每个越野者的最爱,其中H1最接近军用系列
*/
public class HummerH1Model extends HummerModel {
private boolean alarmFlag = true; // 是否要响喇叭
@Override
protected void alarm() {
System.out.println("悍马H1鸣笛...");
}
@Override
protected void engineBoom() {
System.out.println("悍马H1引擎声音是这样在...");
}
@Override
protected void start() {
System.out.println("悍马H1发动...");
}
@Override
protected void stop() {
System.out.println("悍马H1停车...");
}
@Override
protected boolean isAlarm() {
return this.alarmFlag;
}
// 要不要响喇叭,是有客户的来决定的
public void setAlarm(boolean isAlarm) {
this.alarmFlag = isAlarm;
}
}
package com.createtype.desginpatterns.templatemethod;
/**
* @author cbf4Life cbf4life@126.com I'm glad to share my knowledge with you
* all. 客户开始使用这个模型
*/
public class Client {
public static void main(String[] args) {
// 客户开着H1型号,出去遛弯了
HummerH1Model h1 = new HummerH1Model();
h1.setAlarm(false);
h1.run(); // 汽车跑起来了;
// 客户开H2型号,出去玩耍了
// HummerModel h2 = new HummerH2Model();
// h2.run();
}
}
文章链接:http://sunnylocus.iteye.com/blog/216500javascript:mctmp(0);
模板方法模式:
1.那我们总结一下模板方法模式,模板方法模式就是在模板方法中按照一个的规则和顺序调用基本方法,
具体到我们上面那个例子就是run 方法按照规定的顺序(先调用start,然后再调用engineBoom,再调用
alarm,最后调用stop)调用本类的其他方法,并且由isAlarm 方法的返回值确定run 中的执行顺序变更,
2.其中TemplateMethod 就是模板方法,operation1 和operation2 就是基本方法,模板方法是通过汇总
或排序基本方法而产生的结果集。
3.作为模板的方法定义在父类(父类为抽象类),而方法定义使用抽象方法,实现抽象方法的是子类,要在子类实现方法,
才能决定具体的操作。如果在不同的子类执行不同实现就可以发展出不同的处理内容。
不过,无论在哪个子类执行任何一种实现,处理的大致流程都还是要依照父类制定的方式。