模板方法模式(Head first)

有人爱喝茶,有人爱喝咖啡,因为两者都含有咖啡因。

咖啡的冲泡方法:            茶的冲泡法:

1:把水煮沸                    1:把水煮沸

2:用沸水冲泡咖啡          2:用沸水浸泡茶叶

3:把咖啡倒进杯子          3:把茶倒进杯子

4:加糖和牛奶                4:加柠檬

观察上面的步骤发现第1步和第3步是一样的,可以将这两步抽象出来,放到上一层的抽象类中实现。

将第2步和第4步定义成抽象方法,由具体子类实现。最后在抽象类中定义一个方法,调用这4个方法。

package com.headfirst.chapter8;

public abstract class CaffeineBeverage {
	public void prepareRecipe(){
		boidWater();//烧水
		brew();//冲泡
		pourInCup();//倒进杯子
		addCondiments();//加调料
	}
	public void boidWater(){
		System.out.println("Boiling water");
	}
	public void pourInCup(){
		System.out.println("pour in cup");
	}
	abstract void brew();
	abstract void addCondiments();
}

泡茶继承了上面那个抽象类,实现了加调料和冲泡方法

package com.headfirst.chapter8;

public class Tea extends CaffeineBeverage{
	void addCondiments() {//加柠檬
		System.out.println("Add lemon");
	}
	void brew() {//用沸水浸泡茶叶
		System.out.println("Steep Tea Bag");
	}
}

咖啡也继承了上面那个抽象类,实现了加调料和冲泡方法 

package com.headfirst.chapter8;

public class Coffe extends CaffeineBeverage {

	void addCondiments() {//加入牛奶和糖
		System.out.println("add sugar and milk");
	}

	void brew() {//用沸水冲泡咖啡
		System.out.println("Dripping Coffee through filter");
	}
}
 

模板方法定义:

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

可以在模板方法中定义一个“钩子”

可以让子类有能力对算法的不同点进行挂钩,要不要挂钩,由子类决定。

例如可以在上面例子的抽象类中定义一个isCustomerWantsCondiments方法

默认返回true

子类可以覆盖这个方法,在超类的prepareRecipe方法中可以这样写

if(isCustomerWantsCondiments()){

  addCondiments();//加调料

}

模板方法主要用于框架的实现。

猜你喜欢

转载自mynote.iteye.com/blog/1553604