Template Method模式

来源:互联网 发布:网络放大器的使用方法 编辑:程序博客网 时间:2024/05/17 23:15
程序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 BufferedReaderbr;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模式提供了另外一种可选方案。