设计模式学习笔记十三:模板方法模式
2015-07-27 09:01
856 查看
设计模式学习笔记十三:模板方法模式
介绍
模板方法(TEMPLATE METHOD)模式,属于类行为型模式,意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TEMPLATE METHOD使得子类
可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(本段摘自《GoF设计模式》 5.10)。
模板方法有几个要素:
算法骨架:模板执行方法,防止子类更改流程,定义为不可override,即final;
抽象方法:在子类实现的方法;
钩子方法:在模板类中提供默认方法,子类不是必须要实现;
适用场景
算法骨架稳定,部分细节需要自定义。UML结构图:
场景模拟
侍寝:帝时弄骰而定亦或钦点,内侍背佳丽入房,事毕,问留否。留则罢,不留则去龙元。代码实现:
1.模板类/** * 模板类 */ public abstract class AbstractSleeping { final void execute() { String concubine = choiceConcubine(); getConcubine(concubine); try { doSleep(); } catch (InterruptedException e) { System.out.println("帝偶感风寒……"); } if (wantChildernHook()) { doWant(); } } protected void doWant() { System.out.println("帝曰: 留"); } protected boolean wantChildernHook() { return true; } protected void doSleep() throws InterruptedException { // 内涵 Thread.sleep(10L); System.out.println("事毕……"); } protected void getConcubine(String concubine) { System.out.println("内侍背妃子" + concubine + "入房……"); } /** * 选妃子 * @return */ protected abstract String choiceConcubine(); }
2.模板实现类
/** * 翻牌选妃 */ public class RandomSleeping extends AbstractSleeping { /** * 翻牌选妃子 * @return */ @Override protected String choiceConcubine() { String[] concubines = new String[] {"娴·乌拉那拉宜修", "沈眉庄", "安陵容", "富察贵人", "方淳意", "余莺儿", "瓜尔佳文鸯", "滟·叶澜依"}; return concubines[new Random().nextInt(concubines.length)]; } /** * 帝心难测 * @return */ protected boolean wantChildernHook() { return new Random().nextBoolean(); } } /** * 万千宠爱于一身 */ public class SpecialSleeping extends AbstractSleeping { /** * 选妃子 * * @return */ @Override protected String choiceConcubine() { return "甄嬛"; } }
3.Run
public class Run { public static void main(String[] args) { new RandomSleeping().execute(); System.out.println(); new SpecialSleeping().execute(); } }
输出
内侍背妃子滟·叶澜依入房…… 事毕…… 帝曰: 留 内侍背妃子甄嬛入房…… 事毕…… 帝曰: 留
策略模式与模板方法模式的区别
策略模式的算法是可以动态指定的,模板方法模式的算法是在模板类完成的,只是其中的变化方法由子类去生成。策略模式是对象行为型模式,模板方法模式是类行为型模式。
策略模式是接口实现,即组合。模板方式模式是继承实现。OO原则:多用组合,少用继承。
相关文章推荐
- InnoSetup判断应用程序是否正在运行的函数
- Android 性能测试
- hdu 1875 畅通工程再续
- 设计模式学习笔记十三:模板方法模式
- Java DEMO
- 1.07-变量使用注意2
- shell版俄罗斯方块一:方向键获取
- shell版俄罗斯方块一:方向键获取 分类: shell版俄罗斯方块 2015-07-27 09:00 114人阅读 评论(0) 收藏
- 1.05-变量
- 一个游戏机的“山寨”创新,靠什么成功
- 1.06-变量使用注意
- C 程序结构
- Adb 抓不住Genymotion的解决方法
- 设计模式学习笔记十二:访问者模式
- TestNG监听器实现失败自动截图、重跑、自定义html结果文件功能
- 设计模式学习笔记十二:访问者模式
- 布局文件传入参数
- 有关如何入门ACM
- 现有CSDN博客的排名机制
- iOS本地相册 摄像头