Head First 设计模式 --8 模板方法模式 别找我,我会找你
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
设计原则:
1、封装变化
2、多用组合少用集成
3、针对接口变成而非实现
4、松耦合
5、类对修改关闭,对扩展开放
6、依赖抽象而飞具体类
7、只和朋友交谈(迪米特原则)
8、别找我,我会找你(好莱坞原则)
比较好理解,直接看代码(冲茶和咖啡的例子):
abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("boiling water");
}
void pourInCup() {
System.out.println("pouring into cup");
}
boolean customerWantsCondiments() {
return true;
}
}
class Tea extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding Lemon");
}
public boolean customerWantsCondiments() {
return false;
}
}
class Coffee extends CaffeineBeverage {
@Override
void brew() {
System.out.println("Steeping the tea");
}
@Override
void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
public boolean customerWantsCondiments() {
return true;
}
}
public class Test {
public static void main(String[] args) {
Tea myTea = new Tea();
myTea.prepareRecipe();
}
}
类图:

模板就是一个方法,这个方法将算法定义成一组步骤,公共的部分基类直接实现,不同的部分子类重写抽象方法。
上面还有一个技巧是可以通过子类的方法来判断模板中是否要调用某个方法。如果子类不重写那个方法,走的就是基类中的方法。也就是可以重写也可以不重写判断方法。
基类一般都是抽象方法,一般情况下会有相同的方法,算法的方法一般定义成final的,因为这个相当于模板不允许子类覆盖。
设计原则【好莱坞原则:别调用我们,我们会调用你】。
好莱坞原则防止“依赖腐败”的方法,当高层组件调用底层组件,底层组件又调用高层组件等等。这种情况下没有人能搞懂系统是如何设计的。在好莱坞原则下,我们组件将自己挂到系统上,但是高层组件和决定什么时候和怎样使用这些低层组件。也就是高层组件对待低层组件的方式是“别调用我们,我们会调用你”。
好莱坞原则和依赖倒置原则有点关系,依赖倒置教我们尽量避免使用具体类,更多使用抽象。而好莱坞原则是一种设计框架或则组件的技巧,好让低层组件能够被挂钩进计算中,而且又不会让高层组件依赖低层组件。两者的目标都是解耦。让低层组件一点都不依赖高层组件并不可能,我们所能做的就是避免高层和低层组件之间有明显的环状依赖。
Head First 设计模式 --8 模板方法模式 别找我,我会找你的更多相关文章
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- PHP设计模式之模板方法模式
模板方法模式,也是我们经常会在不经意间有会用到的模式之一.这个模式是对继承的最好诠释.当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释.就像我们平 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- C#设计模式(14)——模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 【GOF23设计模式】模板方法模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...
- [设计模式] 22 模板方法模式 template
转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...
- java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)
定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...
随机推荐
- SQL Nexus
在前面的SQLdiag系列中有提到SQLNexus,当时我们用SQLNexus查看了Perfmon Summary(性能计数器).ReadTrace Reports(跟踪文件)两项报表.SQLNexu ...
- Java基础之在窗口中绘图——渐变填充(GradientApplet 1)
Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.*; @SuppressWarnings("s ...
- C#实现执行多条SQl语句,实现数据库事务
C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...
- 使用NPOI导入导出标准的Excel
关于NPOI NPOI是POI项目的.NET版本,是由@Tony Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex. ...
- 说一下linux中shell的后台进程与前台进程
环境: 操作系统:archlinux; 终端模拟器:rxvt-unicode(urxvt); shell:bash; 这里所说的后台进程是指在命令行后面加一个 ampersand(&),前台进 ...
- POJ - 1132Border
POJ - 1132Border Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Descrip ...
- 用xib自定义UITableViewCell
1.文件结构: 2. 先创建一个xib文件,删除原有的view,添加一个TableViewCell控件. 3.ModelTableViewController.m文件 #import "Mo ...
- 使用 supervisor 管理进程
安装: # yum install python-setuptools # easy_install supervisor 如果已经安装了epel和python-pip, 也可以简单 pip inst ...
- mysql分区表的原理和优缺点
1.分区表的原理 分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分 ...
- 原生JS--COOKIE
原生JS--COOKIE: COOKIE基础及应用:1.什么是COOKIE==>页面用来保存信息,比如:自动登录,记住用户名2.COOKIE的特性: --同一个网站中,所有的页面共享同一套co ...