设计模式--模板方法设计模式

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


2.引申知识点:骨架方法定义为 final,目的是防止子类去修改它。算法步骤可以动态改变,使用的是 钩子函数,子类决定是否执行。


3. head first 中的例子

1 冲泡咖啡 冲泡茶    抽象公共部分
2 把水煮沸 把水煮沸 把水煮沸
3 用沸水冲泡咖啡 用沸水冲泡茶叶  用热水泡咖啡或茶
4 把咖啡倒进杯子 把茶倒进杯子 把饮料倒进杯子
5 加糖和牛奶 加柠檬   在饮料中加入适当的调料

4.代码部分

public abstract class CoffeineBeverage {// 咖啡因饮料

	final void prepareRecipe() { // 准备 食谱

		boilWater(); // 把水煮沸
		brew(); // 用热水泡咖啡或茶
		pourInCup(); // 把饮料倒进杯子
		if (customerWantsCondiments()) {
			addCondiments();// 在饮料中加入适当的调料
		}
	}

	abstract void brew();

	abstract void addCondiments();

	private void boilWater() {
		System.out.println("把水煮沸");
	}

	private void pourInCup() {
		System.out.println("把饮料倒进杯子");
	}

	// 钩子函数,子类可以进行修改,用于骨架的构建
	public boolean customerWantsCondiments() {
		return true;
	}
}

public class CoffieWithHook extends CoffeineBeverage {

	@Override
	void brew() {
		System.out.println("用热水泡咖啡");
	}

	@Override
	void addCondiments() {
		System.out.println("在咖啡中加入适当的牛奶和糖");
	}

}

public class TeaWithHook extends CoffeineBeverage {

	@Override
	void brew() {
		System.out.println("用热水泡茶");
	}

	@Override
	void addCondiments() {
		System.out.println("在茶中加入适当的柠檬");
	}

	public boolean customerWantsCondiments() {
		return false;
	}
}

public class Client {
	public static void main(String[] args) {
		CoffieWithHook ch = new CoffieWithHook();
		ch.prepareRecipe();

		System.out.println("------------------");
		
		TeaWithHook th = new TeaWithHook();
		th.prepareRecipe();
	}
}
运行结果:

把水煮沸
用热水泡咖啡
把饮料倒进杯子
在咖啡中加入适当的牛奶和糖
------------------
把水煮沸
用热水泡茶
把饮料倒进杯子

你可能感兴趣的:(设计模式)