深入浅出设计模式之模板方法模式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模板方法模式
模板方法模式在一个方法中定义了一个算法的 骨架,而将一些步骤延迟到子类中。模板方法 使得子类可以在不改变算法结构的情况下,重 新定义算法中的某些步骤。 模板就是一个方法,将算法定义成一组步骤, 任何步骤都可以是抽象的,由子类负责实现, 确保算法的结构不变。 刚才的例子就是典型的模板方法模式
茶类的实现
public class Tea extends CaffeineBeverage { public void brew() { System.out.println("Steeping the tea"); } public void addCondiments() { System.out.println("Adding Lemon"); } }
public class 应聘人1的实现 extends 考察模板 { public void 第二关() { //跟王大妈女儿出去的时候老看路边美女 } public void 第三关() { //手机短信响不停,全是"亲爱的" } public void 第四关() { //坐公交车时不给老人小孩让位子,现在的小 伙子啊 } public void 第五关() { //一有空就在家里玩游戏,上班猛聊QQ } }
void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); }
public abstract class CaffeineBeverage {//抽象类 //被声明为final,我们不希望子类覆盖这个方法 final void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments(); } //因咖啡和茶处理这些方法的做法不同,所以这2个方 法必须被声明为抽象的,剩余的给子类去操心 abstract void brew(); abstract void addCondiments(); //这2个方法不变,不需要子类去处理 void boilWater() { System.out.println("Boiling water"); } void pourInCup() { System.out.println("Pouring into cup"); } }
模板方法模式
本章内容
百度文库
模板方法的产生 模板方法模式的定义 模板方法使用挂钩 好莱坞原则 模板方法举例 模板方法模式 小结
咖啡店:泡茶和泡咖啡法
咖啡泡法
把水煮沸 用沸水冲泡咖啡 把咖啡倒进杯子 加糖、牛奶 …
茶冲泡法
把水煮沸 用沸水冲泡茶叶 把茶倒进杯子 加柠檬 …
咖啡店:泡茶和泡咖啡法
好莱坞原则
Don‘t call me.Let me Call you 反向控制结构是Template Method的典型应 用。 “Don’t call me.Let me Call you”是指一个 父类调用一个子类的操作,而不是相反。
模板和策略
模板方法模式与策略模式的作用十分类似,有 时可以用策略模式替代模板方法模式。模板方 法模式通过继承来实现代码复用,而策略模式 使用委托。委托比继承具有更大的灵活性。继 承却经常被错误的滥用。 策略模式把不确定的行为集中到一个接口中, 并在主类委托这个接口。
咖啡类的实现
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"); } }
例子:王大妈选女婿
需求:王大妈打算为独生女找个女婿,特意为 其未来女婿定义需闯的五关。
第一关:基本条件,年龄要求:25-30; 第二关:考验其是否love她的女儿; 第三关:检验其是否老实不花心; 第四关:考察其是否尊老爱幼; 第五关:观察该人是否勤奋好学有能力。 …
public abstract class 考察模板 { public void 选女婿() { 第一关(); 第二关(); 第三关(); 第四关(); 第五关(); } public final void 第一关() { //年龄:25-30 } public abstract void 第二关(); public abstract void 第三关(); public abstract void 第四关(); public abstract void 第五关(); }
使用钩子的模板方法
钩子是一种被声明在抽象类中的方法,但只有 空的或者默认的实现。钩子的存在,可以让子 类有能力对算法的不同点进行挂钩,要不要挂 钩,由子类自行决定。 代码
钩子
钩子的使用
子类可以实现钩子,也可以不实现 有利于模板方法的扩展。 有利于子类实现算法的可选部分
使用钩子的目的
咖啡泡法
把水煮沸 用沸水冲泡咖啡 把咖啡倒进杯子 加糖、牛奶 …
茶冲泡法
把水煮沸 用沸水冲泡茶叶 把茶倒进杯子 加柠檬 …
两者的共同点
1.把水煮沸 2.用热水泡咖啡或茶 3.把饮料倒进杯子 4.在饮料内加入适当的调料
画出自己设计的类图
CaffeineBeverage
prepareRecipe() boilWater() pourInCup()
模板模式与继承
模板方法估计恰当地使用继承。此模式可以 用来改写一些拥有相同功能的相关的类,将可 复用的一般性行为代码移到基类里面,而把特 殊化的行为代码移到子类里面。熟悉模板方法 模式是重新学习继承的开始。
模板模式中的方法
1)模板方法:必须由抽象类实现,该方法是一 个顶级逻辑,调用任意多个基本方法。子类不 应该修改该方法 2)基本方法:模板方法所调用的方法,有可细 分为抽象方法,具体方法,钩子方法 抽象方法:强迫子类重写的 具体方法:不需要子类重写的,最好声明为 final 钩子方法:子类可以重写的,一般是个空方 法 补充:模板模式的设计理念是尽量减少必须由 子类置换掉的基本方法的数量(可以理解为尽 量减少抽象方法和钩子方法的数量。)
本章小结
模板方法定义了算法的步骤,实现到子类 模板方法模式利用继承实现了代码复用 钩子 好莱坞原则:决策权放在高层,底层执行 工厂方法是模板模式的一个特殊版本。
Coffee prepareRecipe() brewCoffeeGrinds() addSugarAndMilk()
Tea prepareRecipe() steepTeaBag() addLemon()
咖啡使用brewCoffeeGrinds()和 addSugarAndMilk()方法,而茶使用 steepTeaBag()和addLemon()方法。浸泡 (steep)和冲泡(brew)差异其实不大,所以我 们给它新的方法名称brew(),类似加糖和加柠 檬很相似,都是在饮料中加入调料,我们也给 个新名称addCondiments()好了,这样一来, prepareRecipe()方法就是这样: