设计模式-模板方法模式(the Template Method Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/

模板方法模式简介

这是一个被用的相当广泛的一种设计模式,变体也特别多,他建立一个抽象类定义一个算法的结构,但是把细节部分的实现权力交个子类实现,是一种很灵活且代码重用性很高的设计模式。

模板方法模式的定义和基本结构

定义:在一个方法中定义一个算法的骨架,而将其中一些步骤的实现交给子类,模板方法模式使得子类在不改变算法结构的情况下,重新定义了算法中的某些步骤。

一张来自《Head First》的结构图。

是不是超级简单。

AbstractClass:一个超类,其中templateMethod()方法定义了算法结构,而下面的primitiveOperation方法则是结构中交个子类实现的那一部分。

ConcreteClass:继承了AbstractClass,并根据自己的需要实现了超类的抽象方法,在不改变超类算法结构的前提下得到了定制版的templateMethod()方法。

一个简单的实例(java)

我们用《Head First》书中制作饮料的例子来说明,无论是咖啡还是茶,做法其实都是相同的。

1,烧水。

2,放入茶叶/咖啡豆。

3,倒入杯中。

4,加入柠檬/牛奶。

从中我们可以看到这个制作方法(算法)结构是一定的,而且其中有不变的部分和会变的部分。不变的部分我们可以直接实现在超类中,而变的部分我们可以设置成抽象方法留给子类实现。下面我们直接来看代码吧。

首先给出超类 Beverage。

 1 public abstract class Beverage {
 2     public final void prepareRecipte(){
 3         boilWater();
 4         brew();
 5         pourInCup();
 6         addCondiments();
 7     }
 8     void boilWater(){
 9         System.out.println("boiling water");
10     }
11     void pourInCup(){
12         System.out.println("pouring into the cup");
13     }
14     abstract void brew();
15     abstract void addCondiments();
16 }

然后给出tea和coffee的实现。

public class Tea extends Beverage {
    @Override
    void brew() {
        System.out.println("steeping the tea");
    }
    @Override
    void addCondiments() {
        System.out.println("put lemon");
    }
}

public class Coffee extends Beverage {
    @Override
    void brew() {
        System.out.println("putting coffee bean");
    }
    @Override
    void addCondiments() {
        System.out.println("add milk");
    }
}

然后给出测试类。

1 public class Test {
2     public static void main(String[] args) {
3         new Tea().prepareRecipte();
4         System.out.println("");
5         new Coffee().prepareRecipte();
6     }
7 }

输出如下:

可以看到子类中实现的方法在算法结构中得到了体现,另外我们也可以将一些可重写或可不重写的函数在超类中给出一个实现,让子类决定要不要重写这个函数,这个函数一般被叫做回调函数(hook)。

另外工厂模式中的工厂方法其实是模板方法模式的一个特例,大家可以自行对比一下。

外观模式到此结束?(^∇^*)。

参考资料:《Head First 设计模式》。

时间: 2024-10-27 12:30:22

设计模式-模板方法模式(the Template Method Pattern)的相关文章

深入浅出设计模式——模板方法模式(Template Method Pattern)

模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意.模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式. 模式定义模

C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

原文:C#设计模式之十三模板方法模式(Template Method Pattern)[行为型] 一.引言 "结构型"的设计模式已经写完了,从今天我们开始讲"行为型"设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Pattern.还是老套路,先从名字上来看看."模板方法"我第一次看到这个名称,我的理解是,有一个方法的名字叫"模板方法",后来深入学习之后,

第 9 章 模板方法模式【Template Method Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 周三,9:00,我刚刚坐到位置,打开电脑准备开始干活. “小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了, “告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要…(中间省略20 分钟的讲话,如果你听过领导人的讲话,这个你应该能够续上)” 动员工作做完了,那就开始压任务了, “这次时间是非常紧张的

设计模式系列13:模板方法模式(Template Method Pattern)

定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.    --<设计模式GoF> UML类图 使用场景 有多个子类共有的方法,且逻辑相同,可以抽象到父类中作为模板方法实现,避免代码重复. 重要的,复杂的方法,可以考虑作为模板方法. C#代码实现 using System; namespace DoFactory.GangOfFour.Template.Structural { /// <summary>

c#设计模式系列:模板方法模式(Template Method Pattern)

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

GJM: 设计模式 - 模板方法模式(Template Method)

生活中的模板 一.在银行办理业务 Step1:进门取号 Step2:填写单据 Step3:等待叫号 Step4:窗口办理 二.奥运会开幕式 第一步:升国旗奏国歌 第二步:领导人致辞讲话 第三部: 文艺汇演 第四部:入场以上 第五步: 点燃奥运圣火 .

Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开发和维护,所有Java中的类是只能单继承,通过接口来实现多继承:对于接口的话,是可以多继承的,例如:A接口可以同时继承接口B和接口C,但是有一点要注意,就是实现接口A的类必须要实现接口A.B.C中所有的抽象方法:接口之所以可以多继承,就是因为接口结构比较简单. 继承是通过extends关键字来实现,

24种设计模式--模版方法模式【Template Method Pattern】

周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要…(中间省略 20 分钟的讲话,如果你听过领导人的讲话,这个你应该能够续上)”动员工作做完了,那就开始压任务了,“这次时间是非常紧张的,只有一个星期的时间,小三,你负责在一个星期的时间把这批 10 万车模(注:

设计模式之模板方法模式(Template Method)详解及代码示例

一.模板方法模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤.它是一种类行为型模式. 二.模板方法模式优缺点 该模式的主要优点如下. 它封装了不变部分,扩展可变部分.它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展. 它在父类中提取了公共的部分代码,便于代码复用. 部分方法是由子类实现的,因此子类可以通过扩展

JAVA设计模式(17):行为型-模板方法模式(Template Method)

场景 客户到银行办理业务: 取号排队 办理具体现金/转账/企业/个人/理财业务 给银行工作人员评分 核心: 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用工厂方法模式,,将这个节点的代码实现转移给子类完成. 即:处理步骤父类中定义好,具体实现延迟到子类中定义. 概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑