读书人

设计方式之模板方法模式

发布时间: 2012-09-05 15:19:35 作者: rapoo

设计模式之模板方法模式

模板方法模式是设计模式中比较常用的设计模式之一,也是一个比较简单的设计模式,如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;@Overrideprotected void alarm(){// TODO Auto-generated method stubSystem.out.println("奔驰喇叭...");}@Overrideprotected void start(){// TODO Auto-generated method stubSystem.out.println("奔驰启动了..");}@Overrideprotected void stop(){// TODO Auto-generated method stubSystem.out.println("奔驰停止了...");}@Overridepublic void setAlarmable(boolean alarm){// TODO Auto-generated method stubthis.alarmable=alarm;}@Overridepublic boolean getAlarmable(){// TODO Auto-generated method stubreturn this.alarmable;}}


宝马实现类:

public class Bwm extends CarModel{private boolean alarmable;@Overrideprotected void alarm(){// TODO Auto-generated method stubSystem.out.println("宝马喇叭...");}@Overrideprotected void start(){// TODO Auto-generated method stubSystem.out.println("宝马启动了...");}@Overrideprotected void stop(){// TODO Auto-generated method stubSystem.out.println("宝马停止了...");}@Overridepublic void setAlarmable(boolean alarm){// TODO Auto-generated method stubthis.alarmable=alarm;}@Overridepublic boolean getAlarmable(){// TODO Auto-generated method stubreturn 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();}}


读书人网 >软件开发

热点推荐