模板方法模式是设计模式中比较常用的设计模式之一,也是一个比较简单的设计模式,如Servlet,Filter都使用了模版方法模式,Filter中又三个方法,init(),doFilter(),destroy(),他们的执行循序是依次执行,这就是模版方法的典型应用。
下面用启动一个汽车来说明一下模板设计模式,在开车的过程中,包括启动汽车,喇叭,停止汽车,这三个顺序是不能改变的,那么如何控制他们的顺序呢?
实现代码如下:
public abstract class CarModel
{
abstract public void setAlarmable(boolean alarm);
abstract public boolean getAlarmable();
//车子启动的方法
protected abstract void start();
//车子停止的方法
protected abstract void stop();
//车子喇叭的昂发
protected abstract void alarm();
//防止子类改写
final public void run()
{
//先调用启动方法
this.start();
//调用喇叭声音
if(this.getAlarmable())
{
this.alarm();
}
//调用停止方法
this.stop();
}
}
仔细观察上面的一个抽象类:有三个抽象方法,start(),alarm(),stop(),这三个方法都在run中得到了调用,那么为什么要将run方法都设置为final呢,原因是被final锈蚀的方法是不能改写的,所以在子类中,start(),alarm(),stop(),方法的执行顺序是不能改变的,另外请注意:在run方法中有一个if语句,这是一个钩子方法,可以控制alarm的执行。
编写一个奔驰的实现类:
public class Benz extends CarModel
{
private boolean alarmable;
@Override
protected void alarm()
{
// TODO Auto-generated method stub
System.out.println("奔驰喇叭...");
}
@Override
protected void start()
{
// TODO Auto-generated method stub
System.out.println("奔驰启动了..");
}
@Override
protected void stop()
{
// TODO Auto-generated method stub
System.out.println("奔驰停止了...");
}
@Override
public void setAlarmable(boolean alarm)
{
// TODO Auto-generated method stub
this.alarmable=alarm;
}
@Override
public boolean getAlarmable()
{
// TODO Auto-generated method stub
return this.alarmable;
}
}
宝马实现类:
public class Bwm extends CarModel
{
private boolean alarmable;
@Override
protected void alarm()
{
// TODO Auto-generated method stub
System.out.println("宝马喇叭...");
}
@Override
protected void start()
{
// TODO Auto-generated method stub
System.out.println("宝马启动了...");
}
@Override
protected void stop()
{
// TODO Auto-generated method stub
System.out.println("宝马停止了...");
}
@Override
public void setAlarmable(boolean alarm)
{
// TODO Auto-generated method stub
this.alarmable=alarm;
}
@Override
public boolean getAlarmable()
{
// TODO Auto-generated method stub
return this.alarmable;
}
}
编写一个Client类来测试一下:
public class Client
{
public static void main(String[] args)
{
CarModel model=new Benz();
model.setAlarmable(true);
CarModel model2=new Bwm();
model2.setAlarmable(false);
model.run();
model2.run();
}
}