设计模式——模版方法模式
来源:互联网 发布:陆丰龙山中学知乎 编辑:程序博客网 时间:2024/06/05 12:49
适用场景:
- 算法或操作遵循相似的逻辑
重构时(把相同的代码抽取到父类中)
重要、复杂的算法,核心算法设计为模版算法
优点:
1. 封装性好
2. 复用性好
3. 屏蔽细节
4. 便于维护
缺点:
继承(java语言是一个单继承的语言)
具体代码示例:
package com.imooc.pattern.template;/** * 模版方法模式 * * 抽象基类,为所有子类提供一个算法框架 例子:提神饮料 * * @author zhengzy * */public abstract class RefleshBeverage { /* * 制备饮料的模版 方法 封装了所有子类共同遵循的算法框架 */ public final void prepareBeverageTemplate() { // 步骤1 将水煮沸 boilWater(); // 步骤2 泡制饮料 brew(); // 步骤3 将饮料导入杯中 pourInCup(); if (isCustomerWantsCondiments()){ // 步骤4 加入调味料 addCondiments(); } } /* * Hook,钩子函数,提供一个空的方法或者是默认实现 * 具体子类可以自行决定是否挂钩以及如何实现 * 询问用户是否加入调料 */ protected boolean isCustomerWantsCondiments() { return true; } /* * 步骤1 将水煮沸 */ private void boilWater() { // TODO Auto-generated method stub System.out.println("将水煮沸"); } /* * 抽象的基本方法 * 步骤2 泡制饮料 */ protected abstract void brew(); /* * 步骤3 将饮料导入杯中 */ private void pourInCup() { // TODO Auto-generated method stub System.out.println("将饮料导入杯中"); } /* * 抽象的基本方法 * 步骤4 加入调味料 */ protected abstract void addCondiments();}
package com.imooc.pattern.template;/** * 具体子类,提供了咖啡制备的具体实现 * @author zhengzy * */public class Coffee extends RefleshBeverage { @Override protected void brew() { System.out.println("用沸水冲泡咖啡"); } @Override protected void addCondiments() { System.out.println("加入糖和牛奶"); }}
package com.imooc.pattern.template;/** * 具体子类,提供了茶制备的具体实现 * * @author zhengzy * */public class Tea extends RefleshBeverage { @Override protected void brew() { System.out.println("用80°的热水浸泡茶叶5分钟"); } @Override protected void addCondiments() { System.out.println("加入柠檬"); } @Override /* * 子类通过覆盖的形式选择挂载函数 * @see com.imooc.pattern.template.RefleshBeverage#isCustomerWantsCondiments() */ protected boolean isCustomerWantsCondiments() { return false; }}
测试:
package com.imooc.pattern.template;public class RefleshBeverageTest { public static void main(String[] args) { System.out.println("制备咖啡..."); RefleshBeverage r1 = new Coffee(); r1.prepareBeverageTemplate(); System.out.println("咖啡好了..."); System.out.println("\n************************************\n"); System.out.println("制备茶..."); RefleshBeverage r2 = new Tea(); r2.prepareBeverageTemplate(); System.out.println("茶好了..."); }}代码讲解:见注释。
结果:
demo下载
0 0
- 设计模式——模版方法模式
- 设计模式——模版方法模式
- 设计模式——模版方法模式
- 设计模式——模版方法模式
- C++设计模式——模版方法
- 模版方法设计模式
- 模版方法设计模式
- 模版方法设计模式
- 模版方法设计模式
- 模版方法设计模式
- 设计模式-模版方法
- Java设计模式——模版方法模式
- 设计模式之——模版方法模式
- JAVA设计模式(十九)——模版方法模式
- 设计模式详解——模版方法模式
- 设计模式——之模版方法模式
- 设计模式--模版方法模式
- 设计模式 - 模版方法模式
- poj 2503 Babelfish(字典树或着STL)
- PARSEC benchmark 编译
- 白盒测试中的六种覆盖方法
- 这些面试机会,你该主动放弃!
- devenv.exe - assert failure
- 设计模式——模版方法模式
- 常见的三种Web服务架构
- php下基于百度BAE的微信SDK框架
- 异步加载
- 测试一下看这个能用不
- 事务的隔离级别
- JQuery 异步处理,ajax post get getJSON...
- Linux如何控制 CPU 利用率
- leetcode 85:Maximal Rectangle