Head First 设计模式 —— 09. 模版方法 (Template Method) 模式
模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 P289

特点
- 主导算法框架,并且保护这个算法
P288 - 最大化复用代码
P288 - 算法只存在于一个地方,容易修改
P288 - 专注算法本身,由子类提供完整的实现
P288 - 模板方法本身和内部具体操作解耦
P289
设计原则
好莱坞原则:低层组件别调用高层组件,让高层组件调用低层组件。 P296
优点
- 防止依赖腐败(依赖腐败会使用户难以弄懂系统的设计)
P296
思考题
还有哪些模式采用了好莱坞原则? P297
- 工厂方法、观察者
- 抽象工厂、外观、命令
思考题
我们知道应该多用组合,少用继承。 sort() 模板方法的实现决定不使用继承, sort 方法被实现成一个静态的方法,在运行时和 Comparable 组合。这样的做法有何优缺点?你如何处置这个难题?难道 Java 数组让这一切变得特别麻烦吗? P305
优点
- 解耦了数组和对象,避免让对象数组继承数组
缺点
- 可排序数组的对象必须是
Comparable的子类,比较逻辑没法动态改变- 可以采用
Comparator接口,该接口接受两个待比较的对象,返回比较结果;并在sort方法加上一个Comparator参数
- 可以采用
难道 Java 数组让这一切变得特别麻烦吗?
- Java 数组不是将这一切变得麻烦的主要原因,而是 Java 数组和对象数组的没有太多的联系,不能有太多耦合,所以不应该使用继承。(如果对象数组继承 Java 数组,则要求对象本身是
Comparable的子类,极大地限制了数组的使用场景和范围)
思考题
想一想另一个模式,它是模板方法的一种特殊情况,原语操作用来创建并返回对象。这是什么模式?
- 工厂方法模式、抽象工厂模式
所思所想
- 感觉模板方法就是在内部委托了多个策略,交给子类实现具体策略。其实平常写代码中,经常无意中会用到这种思想。比如在处理 excel 文件导入时,步骤相对固定,先进行各种校验,然后处理 excel 文件(根据请求的不同解析成不同的对象入库),最后返回导入结果。当时我就把处理 excel 文件这步抽出来,顺便使用了一下函数式接口。
public Result handleExcel(File excelFile, ExcelConsumer consumer) {
// 各种校验
boolean success = consumer.consume(excelFile);
// 构建结果封装对象,并返回
}
本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/head-first-design-patterns
Head First 设计模式 —— 09. 模版方法 (Template Method) 模式的更多相关文章
- 设计模式(三)Template Method模式
在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式即模板方法模式. 根据下面的示例程序理解模板方法模式. package BigJunOba.bjtu.Te ...
- 设计模式 Template Method模式 显示程序猿的一天
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 不断设计模式~ Template Method模式 老套路,看高清 ...
- 设计模式之美:Template Method(模板方法)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Template Method 模式结构样式代码. 意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. Templat ...
- 设计模式Template Method模式(Template Method)摘录
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...
- 一天一个设计模式——模板方法(Template Method)模式
一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...
- 设计模式之Template Method模式
作用:将具体的处理交给子类 什么是Template Method模式? Template Method模式是指带有模板功能的模式,组成模板的方法被定义在父类中,且这些方法为抽象方法.子类去实现父类中的 ...
- 行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式
1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类.子 ...
- 设计模式(四)Factory Method模式
简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式.在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责. ...
- 条款22 template method 模式
template method 模式,模板方法模式 其实他和C++模板没有关系. 前者是提供的为派生类设计者提供清晰指示的一种方法,这个事实表示"如何去实现基类所规定的契约" 基类 ...
随机推荐
- windows+jenkins+iis 部署
1.安装jenkins 下载地址:https://www.jenkins.io/download/ 2.需要配置java环境 配置教程:https://www.cnblogs.com/liuxiaoj ...
- CF1406E 【Deleting Numbers】
蒟蒻语 蒟蒻这次 \(CF\) 又双叒叕掉分了,\(C\) 都没有调出来. 还好再最后 \(10\) 秒钟调了下 \(E\) 块长 (块长 \(100\) => \(98\)),才没有掉得那么惨 ...
- 优化Windows电脑常见方法,提高速度,释放硬盘C盘
开始,我们首先让电脑变得易于使用一,提高开机速度常见的使电脑变卡的原因是:一台电脑同时安装了多个杀毒软件.一台电脑安装多个杀毒软件不仅占用你电脑大量内存.有时甚至会产生冲突,这会导致电脑运行非常缓慢, ...
- Vue-组件化,父组件传子组件常见传值方式
前言 我们都知道vue核心之一:组件化,vue中万物皆组件,组件化我认为应该来至于模块化的设计思想,比如在模块化开发中,一个模块就是一个实现特定功能的独立的文件,有了模块我们就更方便去阅读代码,更方便 ...
- thinkphp thinkphp6 安装JWT
第一步:composer安装 composer require firebase/php-jwt 下图是执行成功 cd 进入项目目录的vendor 找到firebase 看到下面有一个php-jw ...
- feign代码自动生成插件
简介 feign对微服务之间的http调用做了一层封装,如果B项目想调用A项目的一个web服务,只需要编写对应的接口并标注FeignClient注解.但如果接口发生了变更,对应的Feign代码往往会忘 ...
- [日常摸鱼]bzoj2463 [中山市选2009]谁能赢呢?
题意:两个人在$n*n$的棋盘上玩游戏,一开始棋子在左上角,可以上下左右的走到没有走过的地方,最后不能走的那个输,两个人都采取最优决策问哪个赢 猜结论!$n$为偶数则先手赢,否则后手赢. 考虑用$1* ...
- PHP 直接使用html输出excel
1 <?php 2 header("Cache-Control:public"); 3 header("Pragma:public"); 4 5 head ...
- SpringBoot从入门到精通教程(二)
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- C# 两个时间相减 计算两个时间差(年月日时分秒)
DateTime dt1; DateTime dt2; int days=(dt2.Date-dt1.Date).Days; 或者 TimeSpan ts = dt2 -dt1; ...
