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的,因为这个相当于模板不允许子类覆盖。

设计原则【好莱坞原则:别调用我们,我们会调用你】。

  好莱坞原则防止“依赖腐败”的方法,当高层组件调用底层组件,底层组件又调用高层组件等等。这种情况下没有人能搞懂系统是如何设计的。在好莱坞原则下,我们组件将自己挂到系统上,但是高层组件和决定什么时候和怎样使用这些低层组件。也就是高层组件对待低层组件的方式是“别调用我们,我们会调用你”。

好莱坞原则和依赖倒置原则有点关系,依赖倒置教我们尽量避免使用具体类,更多使用抽象。而好莱坞原则是一种设计框架或则组件的技巧,好让低层组件能够被挂钩进计算中,而且又不会让高层组件依赖低层组件。两者的目标都是解耦。让低层组件一点都不依赖高层组件并不可能,我们所能做的就是避免高层和低层组件之间有明显的环状依赖。

时间: 2024-10-04 13:49:36

Head First 设计模式 --8 模板方法模式的相关文章

【设计模式】——模板方法模式

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤.当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理. AbstractClas是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法.这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现.顶级逻辑也有可能调用一些具体

【大话设计模式】—— 模板方法模式

一.概念 上一篇文章刚刚讲了[大话设计模式]-- 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程.模板方法模式也特别会"偷工减料",把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致.它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊- 下面让我们来看一下它的准确定义: 模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构

大话设计模式_模板方法模式(Java代码)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 简单描述:多个类的行为是差不多的,只是某些局部不一样,则交由父类中抽象出这些子类中相同的部分,父类中定义出不同的部分的接口(方法),这些不同部分的方法则由子类去实现,通过多态,实现代码的重用 大话设计模式中的截图: 例子代码: AbstractClass类: 1 package com.longsheng.templatemethod; 2 3 public

设计模式之模板方法模式(Template Method)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【设计模式】模板方法模式

模板方法模式 一个父类[运动会]类 两个子类,一个[CClass1]类,一个[CClass2]类,班级类是运动会类的子类,父类制定了运动会的流程(算法的逻辑架构),子类分别去实现流程中的具体实现. 子类不需要重写流程,只需要重写流程中每一项的具体内容. 以此为例,流程就是先干什么.后干什么.再干什么,而每一项就是分别干的内容. /************************************************************************ 设计模式 模板方法模式

设计模式(8)--模板方法模式

关键词 :hook 钩子    Applet 中 init() destory() 为钩子,需要子类去实现. 新原则: 别调用我们,我们会调用你们    高层调用低层   低层不能调用高层. 目的 :封装算法 模板方法:子类决定如何实现算法中的步骤 策略:封装可互换的行为,然后使用委托来决定要采用哪一个行为 工厂方法:由子类决定实例化哪个具体类 OO原则:新原则上面 OO模式:模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类.模板方法使得子类可以在不改变算法的结构的情况下,重

设计模式之模板方法模式

(文章的部分内容参考了<设计模式之禅>一书,大家也可以读读看,内容写的非常好) 什么是模板方法模式 它的定义如下: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 读起来很绕口,其实通俗的说就是父类里面定义一些抽象方法,自己不去实现,交由子类去具体实现,父类只负责管理这些抽象方法的运行顺序,管理运行顺序的方法就是模板方法. 举个具体的使用场景:我们画画一般都是先画线稿,然后再进行上色(不要和我说厚涂..),不过不同的画师的

Android 设计模式之模板方法模式

模板方法模式的定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 设计原则:别调用我们,我会调用你,(就好比猎头和求职者,求职者不需要去找猎头,猎头只要有工作就会找到你)称之为好莱坞原则 引用一个例子,一个店中有两饮料:咖啡和茶,他们的冲泡方法 第一步:都是要用沸水 第二步:用热水泡咖啡或茶 第三步:把饮料倒进杯子 第四步:在饮料中加入适当的调料 在上面的步骤中一.三是一样的,可以抽取出来放在基类中,二.四不一

14.设计模式_模板方法模式

一.引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概

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

注意 本博客摘录于秦小波老师写的<设计模式之禅> 模板方法模式 汽车厂造悍马 假设我们是一个汽车公司,现在有客户来了,要求我们造悍马! 既然上级下来命令那就造呗,但是造悍马你得告诉我们汽车有什么功能啊,客户说了:"能启动车,能停止车,能响,能跑."好,功能出来了,开始造汽车了.类图如下: 抽象悍马模型代码如下: public abstract class HummerModel { /* * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正 * 是要能够发