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