Template Method模式

程序1-1
Initialize();
while(!done()){
	Idle();
}
Cleanup();

首先进入初始化。接着进入主循环。在主循环中完成需要做的工作,这些事件或许是处理GUI事件,或许是处理数据库记录。最后,一旦完成了工作,程序就退出主循环,并且在程序终止前做些清除工作。

程序1-2

public class ftocraw{
	public static void main(String[] args){
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		boolean done = false;
		while(!done){
			String fahrString = br.readLine();
			if(fahrString == null || fahrString.length() == 0)
				done = true;
			else{
				double fahr = Double.parseDouble(fahrString);
				double celcius = 5.0/9.0*(fahr-32);
				System.out.println(...);
			}
		}
		System.out.println("exit");
	}
}
这个程序符合1-1中的程序结构。我们可以应用TEMPLATE METHOD模式把这个基本结构从程序1-2中分离出来,该模式把通用代码放入一个抽象基类的实现方法中。这个实现方法完成了这个通用算法,但是将所有的实现细节都交付给该基类的抽象方法。

例如,我们可以封装在一个基类中。

程序1-3


public abstract class Application{
	private boolean isDone = first;
	
	protected abstract void init();
	
	protected abstract void idle();
	protected abstract void cleanup();
	
	protected void setDone(){
		isDone = true;
	}
	protected boolean done(){
		return isDone;
	}
	public void run(){
		init();
		while(!done){
			idle();
		}
		cleanup();
	}
}

    从程序1-3可以看出所有的共组都被叫给抽象方法init, idle, 以及cleanup。init方法处理任何所需的初始化工作;idle方法处理程序的主要工作,并且在setDone方法被调用之前被重复调用;cleanup方法处理程序退出前所需的所有清理工作。

现在我们可以通过继承Application来重写程序1-2,只要实现Application中的抽象方法就可以了。

程序1-4

public class ftocTemplateMethod extends Application{
	private InputStreamReader isr;
	private BufferedReader	br;
	
	public static void main(String[] args) throws Exception{
		(new ftocTemplateMethod()).run();
	}
	
	protected void inti(){
		isr = new InputStreamReader(System.in);
		br = new BufferedReader(isr);
	}
	
	protected void idle(){
		...
	}
	
	protected void cleanup(){
		...
	}
	
	
}

从程序1-4可以看出原先的1-2程序是如何适配到TEMPLATE METHOD模式上去的。但是使用该模式不是都合适的,主要是引用于算法实现上的。通用算法都被封装在基类中,并且通过继承在不同的具体上下文中实现该通用算法。但是这项技术是具有代价的。继承是一种非常强的关系。派生类不可避免地要和它们的基类绑定在一起。不过Strategy模式提供了另外一种可选方案。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值