head first Design Pattern Template

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板就是一个方法,它将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。确保算法的结构保持不变,同时由子类提供部分实现。如果一个步骤子类必须有自己的实现时,该步骤方法设为抽象的,如果子类对一个步骤是可选的,就用钩子,子类可以选择是否覆盖钩子方法。
好莱坞原则:高层组件对待低层组件的方式“别调用(打电话给)我们,我们会调用(打电话给)你。”允许低层组件将自己挂钩到系统上,但高层组件决定什么时候和怎样使用这些低层组件。
为了防止子类改变模板方法中的算法,可以将模板方法声明为final。


在swing中JFrame包含一个update()方法,它控制更新屏幕的算法,JFrame的paint()方法就是一个钩子,默认情况下它什么都不做,通过覆盖paint(),你可以将自己的代码插入JFrame中,和update()挂上钩,显示出你想要的画面。
Java中的数组排序算法也是用模板来实现,数组类型类要实现Comparable接口中的compareTo()方法。
public abstract class CaffeineBeverage {
final void prepareRecipe(){//final防止子类覆盖,模板方法
boilWater();//定义一连串步骤,每个步骤一个方法
brew();
pourInCup();
if(customerWantsCondiments()){
addCondiments();
}
}
abstract void brew();//让子类来实现自己需要的方法
abstract void addCondiments();
void hook() {} //子类根据情况决定是否覆盖这个方法
//coffee & tea 公用的方法
final void boilWater(){
System.out.println("Boiling Water!");
}
final void pourInCup(){
System.out.println("Pour in Cup!");
}
boolean customerWantsCondiments(){//钩子方法,子类可以选择是否覆盖,更灵活
return true;
}
}
Coffee.java一个子类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Coffee extends CaffeineBeverage {
public void brew(){
System.out.println("Dripping Coffee through filter");
}
public void addCondiments(){
System.out.println("Adding Sugar and Milk");
}
public boolean customerWantsCondiments(){
String answer = getUserInput();//用户决定是否添加调料
if (answer.toLowerCase().startsWith("y")) {
return true;
}else {
return false;
}
}
private String getUserInput(){
String answer = null;
System.out.println("Would u like milk and sugar with your coffee (y/n)?");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try{
answer = in.readLine();
} catch(IOException ioe){
System.err.println("IO error trying to read your answer");
}
if(answer == null) return "no";
return answer;
}
}
Duck.java 用于测试sort的类
public class Duck implements Comparable{
String name;
int weight;
public Duck(String name, int weight){
this.name = name;
this.weight = weight;
}
public String toString(){
return name + ": weight " + weight;
}
public int compareTo(Object object){//传入另一个对象和这个对象比较
Duck otherDuck = (Duck)object;
if (this.weight<otherDuck.weight) {
return -1;
} else if (this.weight==otherDuck.weight) {
return 0;
}else{
return 1;
}
}
}
主函数
import java.util.*;
public class BeverageTestDrive {
public static void main(String[] args) {
Coffee coff  = new Coffee();
System.out.println("\nMaking coffee...");
coff.prepareRecipe();
//测试数组类的sort方法
Duck[] ducks = {
new Duck("Daffy", 8),
new Duck("Eddy", 2),
new Duck("Howard", 5),
new Duck("James", 2),
new Duck("Kevin", 6),
new Duck("Kobe", 2),
};
System.out.println("Before sorting:");
display(ducks);
Arrays.sort(ducks);
System.out.println("After sorting:");
display(ducks);

}
public static void display(Duck[] ducks){
for(int i = 0; i< ducks.length; i++){
System.out.println(ducks[i]);
}
}
}

posted @ 2010-05-15 04:54  莫忆往西  阅读(168)  评论(0编辑  收藏  举报