设计模式之模板方法

设计模式之模板方法

Aug 16, 2015

模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具体体现是面向对象编程编程语言里的抽象类(以及其中的抽象方法),以及继承该抽象类(和抽象方法)的子类。

正文

举个例子,泡茶和泡咖啡有同样的步骤,比如烧开水(boilWater)、冲泡(brew)、倒在杯子里(pourOnCup),加小料(addCondiments)等等。但每种饮料冲泡的方法以及所加的小料不一样,所以我们可以利用模板方法实现这个主要步骤。

首先先来定义抽象步骤:


var CaffeineBeverage = function () {

};

CaffeineBeverage.prototype.prepareRecipe = function () {

this.boilWater();

this.brew();

this.pourOnCup();

if (this.customerWantsCondiments()) {

// 如果可以想加小料,就加上

this.addCondiments();

}

};

CaffeineBeverage.prototype.boilWater = function () {

console.log("将水烧开!");

};

CaffeineBeverage.prototype.pourOnCup = function () {

console.log("将饮料到再杯子里!");

};

CaffeineBeverage.prototype.brew = function () {

throw new Error("该方法必须重写!");

};

CaffeineBeverage.prototype.addCondiments = function () {

throw new Error("该方法必须重写!");

};

// 默认加上小料

CaffeineBeverage.prototype.customerWantsCondiments = function () {

return true;

};

该函数在原型上扩展了所有的基础步骤,以及主要步骤,冲泡和加小料步骤没有实现,供具体饮料所对应的函数来实现,另外是否加小料(customerWantsCondiments )默认返回 true,子函数重写的时候可以重写该值。

下面两个函数分别是冲咖啡和冲茶所对应的函数:


// 冲咖啡

var Coffee = function () {

CaffeineBeverage.apply(this);

};

Coffee.prototype = new CaffeineBeverage();

Coffee.prototype.brew = function () {

console.log("从咖啡机想咖啡倒进去!");

};

Coffee.prototype.addCondiments = function () {

console.log("添加糖和牛奶");

};

Coffee.prototype.customerWantsCondiments = function () {

return confirm("你想添加糖和牛奶吗?");

};

//冲茶叶

var Tea = function () {

CaffeineBeverage.apply(this);

};

Tea.prototype = new CaffeineBeverage();

Tea.prototype.brew = function () {

console.log("泡茶叶!");

};

Tea.prototype.addCondiments = function () {

console.log("添加柠檬!");

};

Tea.prototype.customerWantsCondiments = function () {

return confirm("你想添加柠檬嘛?");

};

另外使用 confirm,可以让用户自己选择加不加小料,很不错,不是嘛?

总结

模板方法应用于下列情况:

  1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  2. 各子类中公共的行为应被提取出来并集中到一个公共父类中的避免代码重复,不同之处分离为新的操作,最后,用一个钓鱼这些新操作的模板方法来替换这些不同的代码
  3. 控制子类扩展,模板方法只在特定点调用“hook”操作,这样就允许在这些点进行扩展

和策略模式不同,模板方法使用继承来改变算法的一部分,而策略模式使用委托来改变整个算法。

同步与推荐

深入理解 JavaScript 系列文章,包括了原创,翻译,转载等各类型的文章,如果对你有用,请推荐支持一把,给大叔写作的动力。

时间: 2024-10-18 13:13:07

设计模式之模板方法的相关文章

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

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

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

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

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

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

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

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

Java 设计模式之模板方法开发中应用

模板方法差不多是Java设计模式中除单例之外的另一种非常简单也是我们在写程序时非常常用的一种方法了.以至于当你看到模板方法的设计模式时你会感觉到,这不是我在程序中经常用到的方法么. 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类不可以改变一个算法的结构即可重定义该算法的某些特定步骤. 下面是我总结的模板方法中具体的代码实现通用框架 1:抽象的模板类: package template; public abstract class AbstractClass { protect

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

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

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

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

设计模式之模板方法模式

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

java设计模式之模板方法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744002 今天你还是像往常一样来上班,一如既往地开始了你的编程工作. 项目经理告诉你,今天想在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以XML格式进行包装,这样以后可以方便与客户端进行交互.并且在包装开始前和结束后要打印日志,这样方便调试和问题定位. 没问题!你觉得这个功能简直是小菜一碟,非常自信地开始写起代码. Book对象代