【设计模式 - 23】之模版方法模式(Template)
1、模式简介
模版方法模式的定义:
模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模版方法模式的优点:
- 封装不变部分,扩展可变部分;
- 提取公共代码,便于维护;
- 行为由父类控制,子类实现。
模版方法模式的缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
模版方法模式的适用场景:
- 当类中有多个子类共有的方法,且逻辑相同时;
- 当有重要的、复杂的方法时,可以考虑作为模板方法。
2、案例
冲泡咖啡和冲泡茶叶都有相同的步骤:
- 烧开水;
- 冲泡;
- 将咖啡/茶叶倒入到杯子中;
- 加调料。
因此,我们可以使用模版方法模式,将这些步骤提取出来作为模版使用。具体代码如下:
制作饮料的抽象父类BeverageMaker,将烧水和倒入杯子的方法封装,冲泡和加调料的方法抽出作为接口方法。代码如下:
public abstract class BeverageMaker {
public final void makeBeverage() {
boilWater();
brew();
putInCup();
addCondiments();
}
// 烧水
protected void boilWater() {
System.out.println("烧水......");
}
// 冲泡
protected abstract void brew();
// 倒入到杯子中
protected void putInCup() {
System.out.println("倒入杯中......");
}
// 加调料
protected abstract void addCondiments();
}
制作咖啡的方法类CoffeeMaker中的代码:
public class CoffeeMaker extends BeverageMaker {
@Override
protected void brew() {
System.out.println("冲泡咖啡......");
}
@Override
protected void addCondiments() {
System.out.println("添加牛奶......");
}
}
制作茶的方法TeaMaker中的代码:
public class TeaMaker extends BeverageMaker {
@Override
protected void brew() {
System.out.println("冲泡茶叶......");
}
@Override
protected void addCondiments() {
System.out.println("添加柠檬......");
}
}
测试类Test中的代码:
public class Test {
public static void main(String[] args) {
System.out.println("制作咖啡的步骤如下:");
BeverageMaker coffeeMaker = new CoffeeMaker();
coffeeMaker.makeBeverage();
System.out.println();
System.out.println("制作茶叶的步骤如下:");
BeverageMaker teaMaker = new TeaMaker();
teaMaker.makeBeverage();
}
}
运行结果如下图所示:
下面贴出模版方法模式代码的GitHub地址:【GitHub - Template】。
【设计模式 - 23】之模版方法模式(Template)的更多相关文章
- 设计模式 笔记 模版方法模式 Template Method
//---------------------------15/04/28---------------------------- //TemplateMethod 模版方法模式----类行为型模式 ...
- Head First 设计模式笔记(模版方法模式)
1.定义: 在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中.模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 2.类图: 3.说明: 模版方法可以理解为一个方法里面包 ...
- 模版方法模式(Template Method)
1.概念 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型 ...
- 《Head first设计模式》之模版方法模式
模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 有些人没有咖啡就活不下去:有些人则离不开茶.两者共同的 ...
- 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)
. 实例介绍 在本例中,我们使用一个常见的场景,我们每个人都上了很多年学,中学大学硕士,有的人天生就是个天才,中学毕业就会微积分,因此得了诺贝尔数学奖:也有的人在大学里学了很多东西,过得很充实很满意 ...
- NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)
摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...
- 设计模式之模版方法模式(Template Method Pattern)
一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...
- 第13章 模版方法模式(Template Method)
原文 第13章 模版方法模式(Template Method) 模板模式 模板模式 举例:模拟下数据库的update方法,先删除在插入. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- .NET设计模式(16):模版方法(Template Method)(转)
摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...
随机推荐
- CUDA获取显卡数据
一个简单的获取Nvidia显卡信息的程序 #include<iostream> int main() { cudaDeviceProp prop; int count; cudaGetDe ...
- mysql-5.5.25-winx64在win7 x64 免安装配置
os:win7 x64 mysql:mysql-5.5.25-winx64 将mysql-5.5.25-winx64.zip 解压缩到F:\mysql-5.5.25-winx64 目录下: 1.将my ...
- 从 IT 的角度思考 BIM(一):面向对象
还记得那个笑话吗:要把大象放进冰箱,总共分几步?这不仅仅是一个笑话,还是一个值得我们好好分析的笑话. 如果要放进冰箱的是一个苹果,那么也就不可笑了,但换成大象,就引起了我们的兴趣和注意,为什么? 我们 ...
- cocos2d-x Tests讲解 Particle System(粒子系统)
转载请注明出处: http://www.cnblogs.com/shangdahao/archive/2012/04/14/2447571.html 一.粒子系统简介: 粒子系统最早出现在80年代,主 ...
- python 重载 __hash__ __eq__
__author__ = 'root' from urlparse import urlparse class host_news(): def __init__(self, id, url): se ...
- 小波变换 C++ opencv 实现
小波变换 C++ opencv 实现 小波简介: http://www.blogbus.com/shijuanfeng-logs/221293135.html 源码: /// 小波变换 Mat W ...
- hdu 1827
强连通分量——tarjin算法: 这题的思路就是找出多少个出度为0的连通分量,结果就是这些连通分量的元素的最小值相加: 一道很简单的题,改了我好久,= =!~ 贴代码: #include<cst ...
- CAS单点登录配置[2]:证书生成
上一篇介绍了准备工作,本片将介绍如何生成证书. 服务器端证书 1 我们在F盘下建立一个cas文件夹,在此文件夹中生成证书文件,打开命令窗口,进入此目录下,如图: 2 生成服务器端证书, 此命令用于在当 ...
- applicationDefaultJvmArgs:
server.context-path=/HelloMultiServlet server.port=8080 applicationDefaultJvmArgs: [ "-agentlib ...
- PLSQL Developer Debug
如果要查看存储过程或者函数的执行过程,可以用debug的模式.PLSQL Developer提供了debug功能,以函数为例: 1. 找到你要debug的函数,然后右击—>选择“Add debu ...