设计模式 - 模版方法
设计模式 - 模版方法
场景
小张的团队最近接受一个需求,实现实现一家咖啡店的冲泡咖啡和茶的冲泡自动化。之前这家咖啡店都是由咖啡师傅手动进行调制咖啡和茶。现在咖啡店需要引入自动化的点单和调制饮料的系统,小张负责实现调制饮料的功能。
咖啡师傅手工冲泡咖啡和茶的流程:
冲泡咖啡:
把水煮沸
用沸水冲泡咖啡
把咖啡倒入杯子
加糖和牛奶
冲泡茶:
把水煮沸
用沸水冲泡茶叶
把茶倒入杯子
加柠檬
小张先简单的想了一下, 如果直接实现程序,那么新建调制咖啡和调制茶的对象,在每个对象里面实现上述步骤。这样想了之后小张本想直接实现,但是由于信心不足,找老王帮他code review一下思路。 老王说,小张啊,你这实现也可以,不过不够优雅啊,你在仔细看一下上述步骤,有没有发现重复或者共性。
小张听了老王的话,觉得自己的设计应该太粗暴了,按照老王的引导,小张仔细看了上述步骤,发现上述步骤,1和4 是很相像的。4(加糖和牛奶/加柠檬)步骤相当于增加调料本质是相同的。那么他应该封装一下冲泡咖啡/茶的步骤算法。
找出共性进行封装,减少重复代码,使系统达到维护和扩展成本很低的状态。
老王夸奖到,很不错嘛,小张你已经慢慢的了解了面向对象(OOP)及使用设计模式的原因。你可以了解一下模版方法。
模版方法
模版方法实现冲泡咖啡
小张去了解了一下模版方法。针对上述冲泡步骤进行了思考。
应该有一个抽象的对象来描述冲泡饮料这一行为,并且抽象的类实现了具体冲泡对象的共性步骤也就是1.把水煮沸和3.把饮料倒入杯子。有两个具体的子类来具体实现冲泡茶和咖啡。
并且有些客户不需要加调料,那么需要对最后一步进行判断,是否添加调料。
我们来看一下小张的类图:
模版方法:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤。
代码实现
冲泡饮料的抽象类
package xuelongjiang.designpartten.templatemethod;
/**
*
模板方法
@Author xuelongjiang
*/
abstract public class CaffeineBeverage {//算法。 抽象类的算法是final 的不允许被子类修改
public final void prepareRecipe(){//算法的具体步骤boilWater(); //烧水brew();//冲泡pourInCup();// 把饮料倒入杯子if(hook()){addCondiments();// 加调料}
}
public abstract void brew();
public abstract void addCondiments();
public void boilWater(){
System.out.println("烧水");
}
public void pourInCup(){
System.out.println(“把饮料倒入杯子”);
}/**
- 钩子,具体实现可以对算法步骤做一些控制
- @return
*/
public boolean hook(){
return true;
}
}
可以看到我们在冲泡咖啡/茶的抽象类中有一个hook方法,这个方法就是钩子方法。默认返回true,如果冲泡咖啡默认是加调料的那么子类就不用重写hook方法。
咖啡类
package xuelongjiang.designpartten.templatemethod;
/**
@Author xuelongjiang
*/
public class Coffee extends CaffeineBeverage {@Override
public void brew() {
System.out.println(“用沸水冲泡咖啡粉”);
}@Override
public void addCondiments() {
System.out.println(“加糖和牛奶”);
}@Override
public boolean hook() {
return super.hook();
}
}
茶类
package xuelongjiang.designpartten.templatemethod;
/**
@Author xuelongjiang
*/
public class Tea extends CaffeineBeverage {@Override
public void brew() {
System.out.println(“用沸水侵泡茶叶”);
}@Override
public void addCondiments() {
System.out.println(“加柠檬”);
}@Override
public boolean hook() {
return super.hook();
}
}
测试类
package xuelongjiang.designpartten.templatemethod;
/**
@Author xuelongjiang
*/
public class TemplateMethodTest {public static void main(String[] args) {
CaffeineBeverage caffeineBeverage = new Tea();
caffeineBeverage.prepareRecipe();System.out.println("-------------------");caffeineBeverage = new Coffee();caffeineBeverage.prepareRecipe();
}
}
模版方法和策略模式的对比
模版方法:控制算法内部。
策略模式:不同算法的管理。
还记得我们在策略模式中武器示例吗? 拳头,木棍,手枪是实现接口的具体的算法,而不接口的算法内部。
两个模式很相像,但是解决的问题是不同。
要点
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。(即高层组件对低层组件的方式是:别调用我们,我们会调用你们)。
模版方法定义了算法的步骤,把这些步骤的实现延迟到了子类。
模版方法模式为我们提供了一种代码复用的重要技巧。
模版方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
为了防止子类改变模版方法中的算法,可以将模版方法声明为final
模版方法和策略模式都封装了算法,一个用组合(策略模式),一个用继承(模版方法)。
作者:我爱看明朝
来源:CSDN
原文:https://blog.csdn.net/u013565163/article/details/79285617
版权声明:本文为博主原创文章,转载请附上博文链接!
设计模式 - 模版方法相关推荐
- 设计模式 模版方法模式 展现程序员的一天
继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算 ...
- 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)
0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...
- 设计模式——模版方法
一.首先记住什么模版方法模式(看后面的代码理解): 模版方法模式指在一个方法,里面包含了一个多步骤的算法骨架,其中一个或者多个步骤允许子类延后实现.允许子类在不修改算法的结构的 前提下,对一个或多个步 ...
- Java设计模式——模版方法模式
1.简介 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template ...
- .NET设计模式(16):模版方法(Template Method)
概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识 ...
- 设计模式(三)模版方法(行为型)
模板方法模式:定义一个算法的执行骨架,将具体的算法实现延迟到子类完成. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的 ...
- 详解设计模式:模版方法模式
模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...
- (15)模版方法设计模式
一.概念 模板设计模式-基于抽象类的,核心是封装算法 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供具体实现,使用模板方法模式有Spring.Servlet.AQS等 在一个方法中定义一 ...
- 设计模式(九)模版方法模式
相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 设计模式(四)简单工厂模式 设计模式(五)观察者模式 设计模式(六)代理模式 设计模式(七)装饰模式 ...
- 设计模式培训之七:模版方法
查看本人文章索引请通过http://www.cnblogs.com/seesea125/archive/2012/04/17/2453256.html 一.定义 定义一个操作中的算法的骨架,而将一些步 ...
最新文章
- 这些优秀的国产分布式任务调度系统,你用过几个?
- MaxCompute用户初体验
- win10系统修改Intel VT-x时进入不了BIOS问题
- 网络编程学习方法和图书推荐
- Android多线程分析之三:Handler,Looper的实现
- 浏览器绑架:曾几何时,喜爱的“百度”成为了“流氓”的代名词?- 移除hao123首页...
- java中showconfirmdialog_Java实现超市管理系统(含数据库)
- java零碎要点001--深入理解JVM_Java的堆内存_栈内存_以及运行时数据区的作用
- 统计机器学习导论第四章答案
- 计算机快捷键屏幕保护是什么原因,电脑屏幕保护_电脑屏幕保护快捷键
- Python打印九九乘法表
- RINEX3文件中的toc,toe,IODE
- css3动态渐变动画
- item2vec--word2vec在推荐领域的使用
- CTF(二)DES中的S盒
- ICDAR 2017 数据集介绍
- 优秀IT项目经理的六大特质_转帖IT专家网
- 半导体器件基础07:三极管基础(3)
- TLS-SRTP协议详解
- 黑马内部资料,不加密,直接看!快领取
热门文章
- c语言程序与结构,c语言基础与顺序结构-c语言程序设计.ppt
- KMP算法------字符串匹配问题
- 活动推荐 | 首届云原生编程挑战赛开始报名啦~
- Kotlin实战【六】Kotlin中集合的创建
- path和classpath的区别
- java web教室管理系统_“真香”教程,455集全套java视频教程,自己拿走去学习吧...
- nodejs如何实现ajax,nodejs + express怎么实现Ajax方式及其简单功能
- android eclipse 运行项目设置程序默认安装到sd卡,Android eclipse 运行项目设置程序默认安装到SD卡...
- html的经典语法大全,HTML语法大全
- html判断sql没结果,SQL存储过程测试(8)——当待测存储过程没有返回值的时候 如何判断测试结果是否通过...