【设计模式 - 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 ...
随机推荐
- [转]Python中的矩阵转置
Python中的矩阵转置 via 需求: 你需要转置一个二维数组,将行列互换. 讨论: 你需要确保该数组的行列数都是相同的.比如: arr = [[1, 2, 3], [4, 5, 6], [7, 8 ...
- Apple 公司开发者账号注册
苹果公司开发者账号注册流程详解 这段时间在给朋友申请苹果账号,从个人开发者账号.公司账号到企业账号,申请了个遍.这里对申请流程做一下介绍,方便其他朋友,少走弯路,账号早日申请通过. 1.首先介绍下 ...
- 传感器- 加速计 - CoreMotion
/** * CoreMotion * */ #import "ViewController.h" #import <CoreMotion/CoreMotion.h> ...
- vs2010 使用SignalR 提高B2C商城用户体验(一)
vs2010 使用SignalR 提高B2C商城用户体验(一) 1.需求简介,做为新时代的b2c商城,没有即时通讯,怎么提供用户粘稠度,怎么增加销量,用户购物的第一习惯就是咨询,即时通讯,应运而生.这 ...
- 【高德地图API】如何解决坐标转换,坐标偏移?
http://bbs.amap.com/thread-18617-1-1.html#rd?sukey=cbbc36a2500a2e6c2b0b19115118ace519002ff3a52731f13 ...
- python学习之---匿名函数,返回函数,偏函数
1. 返回函数: 所谓的返回函数,指的是函数作为返回值.高阶函数除了可以接受函数作为参数外,同样可以接受函数作为结果返回.以下是一个可变参数的求和例子,一般求和函数是如此这般定义的: >> ...
- ABAP打开TCODE
CALL FUNCTION 'TH_CREATE_MODE' EXPORTING transaktion = 'ZGNBWD001' EXCEPTIONS max_session ...
- java虚拟机运行机制
转自java虚拟机运行机制 首先简单阐述下解释型语言和编译型语言的联系与区别. 编译型语言是通过编译器将程序编译成目标机器所能识别的机器码,而解释型语言不需要编译过程.由该语言的解释器读取脚本,按照语 ...
- 系统调用与API的区别
整理自系统调用与API的区别 1.为什么用户程序不能直接访问系统内核模式提供的服务? 答:在linux中,将程序的运行空间分为内核与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程 ...
- Unreal Engine4 蓝图入门
微信公众号:UE交流学习 UE4开发群:344602753 蓝图是Unreal Engine的特点,用C++编程固然好,但是效率要低很多,主要是国内资料比较少,所以不太容易学习,用蓝图编程可以节 ...