设计模式:(2)模板方法模式

首先我们先来抽象一下。

模板方法模式:属于行为模式

意图:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod是的子类可以不改变算法结构即可定义该算法的某些步骤

我们可以想象一些现实例子,去淘宝买衣服往往步骤是比较稳定和明确的,我们无非需要 登录淘宝->选择喜欢的产品->下单。这样三个步骤,但是你很快就会发现,尽管登录和下单是两个稳定的步骤,但是,选择商品这一环节可以是时刻变化的。

比较不好的实现方式是:

class Base
{
public:
    bool login();
    void buy(Good *good);
}

class App
{
public:
    Good *choiceBest();
}

int main()
{
    Base a;
    App b;
    if(a.login())
    {
        a.buy(b.choiceBest());
    }

}

上面代码,必须等到运行时才能确定步骤,并且由用户来确定。这是没有必要的,因为我们的假定是,这个步骤是恒定不变的,所以,应该采取一种可以更为优秀的做法,那就是模板方法,我们需要一个方法,用来执行这个固定的步骤,也就是一个确定的算法骨架。

所以,我改成这样一种形式:

class Base
{
public :
    bool login();
    virtual Good *choiceBest()=0;
    void buy(Good *good);
    void templateRun()    //重点的模板方法就是我
    {
        if(login())
        {
             buy(choiceBest);
        }
    }
}

这个是一开始确定的抽象基类,于是,当我们要使用这样一种方法,我们只需要:

class App:Public Base
{
public:
    Good *choiceBest()
    {
       //具体实现
    }
}

对抽象的方法进行具体实现。

运行时:

int main()
{
    Base * a = new App();
    a->templateRun();
    delete a;
}

我们只需要关注变化的具体实现。好在回头看看模板方法的定义,怎么样,大概就是这样一种结构图:

这是书上的结构图,也就是说,一个基本的抽象类,用于定义确定的步骤,和保护一个模板方法,我们只需要定义我们具体的类实现一些后期的步骤即可。

这里面我们会看到两种函数方法,一种是具体的函数方法 ,还有一种是抽象的函数方法  在c++语法里面我们,通过virtual关键字,并且在声明后面加上=0语法来保证后代一定要实现,具体的讲就是,抽象方法要求后代必须去写它的具体实现。当然事实上,还有一种钩子方法, 如果我们不要求后代必须实现,我们事先有一套缺省的执行实现,那么我们可以把=0去掉,确定为一个钩子方法。

时间: 2024-10-12 12:31:18

设计模式:(2)模板方法模式的相关文章

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

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤.当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理. 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 { /* * 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正 * 是要能够发