模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
设计原则:
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 模板方法模式 别找我,我会找你的更多相关文章

  1. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  2. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  3. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  4. PHP设计模式之模板方法模式

    模板方法模式,也是我们经常会在不经意间有会用到的模式之一.这个模式是对继承的最好诠释.当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释.就像我们平 ...

  5. java设计模式之模板方法模式

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  6. C#设计模式(14)——模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  7. 【GOF23设计模式】模板方法模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...

  8. [设计模式] 22 模板方法模式 template

    转http://www.jellythink.com/archives/407 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而 ...

  9. java_设计模式_模板方法模式_Template Method Pattern(2016-08-11)

    定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤.这里的算法的结构,可以理解为你根据需求设计出来的业务流程.特定的步骤就是指那些 ...

随机推荐

  1. Celery,Tornado,Supervisor构建和谐的分布式系统

    Celery 分布式的任务队列 与rabbitmq消息队列的区别与联系: rabbitmq 调度的是消息,而Celery调度的是任务. Celery调度任务时,需要传递参数信息,传输载体可以选择rab ...

  2. 设置SQLServer的行版本控制隔离级别

    1.--查询数据库状态 select name,user_access,user_access_desc,snapshot_isolation_state,snapshot_isolation_sta ...

  3. Openstack搭建相关问题

    1.Openstack添加新磁盘到根分区 初始化分区sdb为物理卷pv pvcreate /dev/sdb  //初始化 pvdisplay  //显示物理卷信息 vgextend centos /d ...

  4. HandlerThread 用法

    HandlerThread最大的优势在于引入MessageQueue概念,可以进行多任务队列管理. HandlerThread背后只有一个线程,所以任务是串行依次执行的.串行相对于并行来说更安全,各任 ...

  5. kafka 安装

    kafka是一个分布式的消息缓存系统 kafka集群中的服务器都叫做broker kafka有两类客户端,一类叫producer(消息生产者),一类叫做consumer(消息消费者),客户端和brok ...

  6. <<卸甲笔记>>-Oracle线下迁移到PPAS

    迁移原则 1.尽量保持Oracle与PPAS一致,这会使得日后应用程序迁移更为简单 2.迁移前检查PPAS中是否有同名帐号及同名的Schema a)如果有,建议考虑删除或改名 b)如果没有,先手工建立 ...

  7. 多列布局——Columns

    为了能在Web页面中方便实现类似报纸.杂志那种多列排版的布局,W3C特意给CSS3增加了一个多列布局模块(CSS Multi Column Layout Module).它主要应用在文本的多列布局方面 ...

  8. CRM 2011 Install Errors - Tips and Tricks continued(转)

    The more I get to install/upgrade to CRM 2011 in different environment the more I come across differ ...

  9. SalesForce 入门

    标签: Salesforce.com 一开始是一个云端的销售自动化(Sales Force Automation, SFA)以及客户关系管理工具(Customer Relationship Manag ...

  10. maven 编译插件

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compi ...