设计模式之模板方法模式

模板方法模式是设计模式中比较常用的设计模式之一,也是一个比较简单的设计模式,如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();
		
	}
}	


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值