模板方法模式是由模板(抽象类)定义子方法执行顺序,子类实现子方法,其实很简单,我们平时很常用,只是不知道这个叫模板方法模式罢了。 定义模板(父类):
package com.pocketdigi.patterns.templatemethod;
public abstract class HummerModel {
/**
* 这个叫基本方法,子类可以覆盖
* 基本方法分三类,在抽象类中实现了的基本方法叫做具体方法;
* 在抽象类中没有实现,在子类中实现了叫做抽象方法
* 可以改变模板方法行为的叫钩子方法
* 不允许外部直接调用这些方法,所以用protected
*/
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void engineBoom();
/**
* 这个叫钩子方法
* @return
*/
protected boolean isAlarm()
{
return true;
}
/**
* 定义了其他方法的执行顺序,并且子类不能修改,叫模板方法
*/
public final void run(){
start();
engineBoom();
//钩子方法改变行为
if(isAlarm())
{
alarm();
}
stop();
}
}
不同的子类实现:
package com.pocketdigi.patterns.templatemethod;
public class HummerH1 extends HummerModel {
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("悍马H1启动");
}
@Override
protected void stop() {
// TODO Auto-generated method stub
System.out.println("悍马H1停止");
}
@Override
protected void alarm() {
// TODO Auto-generated method stub
System.out.println("悍马H1鸣笛");
}
@Override
protected void engineBoom() {
// TODO Auto-generated method stub
System.out.println("悍马H1引擎轰鸣");
}
}
package com.pocketdigi.patterns.templatemethod;
public class HummerH2 extends HummerModel {
boolean isAlarm;
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("悍马H2启动");
}
@Override
protected void stop() {
// TODO Auto-generated method stub
System.out.println("悍马H2停止");
}
@Override
protected void alarm() {
// TODO Auto-generated method stub
System.out.println("悍马H2鸣笛");
}
@Override
protected void engineBoom() {
// TODO Auto-generated method stub
System.out.println("悍马H2引擎轰鸣");
}
/**
* 覆盖钩子方法
*/
@Override
protected boolean isAlarm() {
// TODO Auto-generated method stub
return isAlarm;
}
public void setAlarm(boolean isAlarm) {
this.isAlarm = isAlarm;
}
}