您的位置:首页 > 其它

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

2014-10-30 09:53 337 查看
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();
}
}
运行结果:

把水煮沸

用热水泡咖啡

把饮料倒进杯子

在咖啡中加入适当的牛奶和糖

------------------

把水煮沸

用热水泡茶

把饮料倒进杯子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: