首页 > 其他分享 >行为型模式-模板方法模式

行为型模式-模板方法模式

时间:2023-11-21 14:11:51浏览次数:27  
标签:行为 基类 模式 算法 抽象 子类 方法 模板

1 什么是模板方法模式

模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。这样可以在不改变算法结构的情况下,允许子类根据自身的需求来实现特定的步骤。

模板方法模式通常由一个抽象基类提供一个模板方法,该方法定义了算法的骨架,并调用一系列的抽象和/或具体方法。子类继承该抽象基类并实现其中的具体方法,从而实现自己的算法步骤,但不能改变算法的整体结构。

模板方法模式的关键要素包括:

  • 抽象基类(Abstract Base Class):提供了算法的骨架,定义了模板方法和抽象方法,用于规定算法各个步骤的执行顺序。
  • 具体子类(Concrete Subclass):继承抽象基类,实现具体的算法细节,即实现抽象方法,以定制算法的特定步骤。
  • 模板方法(Template Method):位于抽象基类中的方法,定义了算法的骨架,包含一系列的步骤调用,可以是具体方法或抽象方法。
  • 钩子方法(Hook Method):位于抽象基类中的可选方法,可供子类选择实现,用于在模板方法中定制算法行为。
  • 具体方法(Concrete Method):位于抽象基类中的方法,提供算法中共同的实现逻辑,被模板方法和子类共享调用。

2 举个例子

下面以制作咖啡和茶为例来说明模板方法模式:

#include <iostream>

// 抽象基类:饮料
class Beverage {
public:
    // 模板方法,定义了算法的骨架
    void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
        // 钩子方法,子类可以选择性地覆盖它
        if (customerWantsCondiments()) {
            addExtraCondiments();
        }
    }

    // 具体方法:烧水
    void boilWater() {
        std::cout << "烧水" << std::endl;
    }

    // 抽象方法:冲泡
    virtual void brew() = 0;

    // 具体方法:倒入杯中
    void pourInCup() {
        std::cout << "倒入杯中" << std::endl;
    }

    // 抽象方法:添加调料
    virtual void addCondiments() = 0;

    // 钩子方法:加入额外调料,子类可以选择实现它
    virtual void addExtraCondiments() {}

    // 钩子方法:询问客户是否需要额外调料,默认返回 true
    virtual bool customerWantsCondiments() {
        return true;
    }
};

// 具体类:咖啡
class Coffee : public Beverage {
public:
    virtual void brew() override {
        std::cout << "冲泡咖啡" << std::endl;
    }

    virtual void addCondiments() override {
        std::cout << "加入糖和牛奶" << std::endl;
    }

    virtual bool customerWantsCondiments() override {
        // 这里我们覆盖了钩子方法,并返回 false 表示客户不需要额外调料
        return false;
    }
};

// 具体类:茶
class Tea : public Beverage {
public:
    virtual void brew() override {
        std::cout << "冲泡茶叶" << std::endl;
    }

    virtual void addCondiments() override {
        std::cout << "加入柠檬" << std::endl;
    }

    virtual void addExtraCondiments() override {
        std::cout << "加入蜂蜜" << std::endl;
    }
};

// 客户端代码
int main() {
    Beverage* coffee = new Coffee();
    coffee->prepareBeverage();

    std::cout << "\n";

    Beverage* tea = new Tea();
    tea->prepareBeverage();

    delete coffee;
    delete tea;

    return 0;
}

在这个示例中,抽象基类 Beverage 定义了算法的骨架,其中 prepareBeverage 方法是一个模板方法,定义了一系列烧水、冲泡、倒入杯中、添加调料等步骤。具体的步骤被定义为虚方法,需要由子类来实现。

Coffee 和 Tea 类分别是子类,它们继承了 Beverage 类并实现了其中的抽象方法。每个子类可以根据自己的需求来具体实现 brew 和 addCondiments 方法,以定制自己的饮料制作过程。同时,它们也可以覆盖 customerWantsCondiments 和 addExtraCondiments 方法,根据需要对饮料进行个性化的调整。

在客户端代码中,我们创建了 Coffee 和 Tea 对象,并调用它们的 prepareBeverage 方法。由于 prepareBeverage 是模板方法,因此它们的制作过程都按照算法骨架执行,但是具体的实现细节可以根据每个子类的需求进行定制。

这样,我们就使用模板方法模式实现了制作咖啡和茶的例子。模板方法模式允许我们定义算法的骨架,同时又保留了对具体步骤实现的灵活性。

3 总结

模板方法模式提供了一种在不改变算法结构的情况下,允许子类自定义部分算法步骤的灵活性。它是一种常用的设计模式,可以应用于各种场景,例如算法、框架以及生命周期管理等。

标签:行为,基类,模式,算法,抽象,子类,方法,模板
From: https://www.cnblogs.com/luoxiang/p/17846450.html

相关文章

  • STM32使用SDIO模式和DMA实现SD卡的读写及擦除操作
    对于STM32操作SD卡来说,最重要的就算初始化、写操作、读操作、擦除这几个操作了。对于初始化部分上一篇文章已经分析,本篇就主要分析写、读、擦除操作。本篇函数来自于STM32提供的例程。参考野火的程序进行了解释,与野火函数有些不同。这几种函数完成之后,就是开始实现对SD卡进行操作了......
  • 【AD域控】组策略模板的导入与使用
    接到了leader的需求,希望能够设置浏览器的主页,由于我们是运维岗,负责AD域控,脑海中第一时间就跳出了舍近求远的域控设置。当然最后也是没有成功,但总结出了在Windows设备上配置MicrosoftEdge策略设置,血泪总结!【AD域控】组策略模板的导入与使用 1.下载MicrosoftEdgeforBusiness......
  • pp_orange的多项式模板
    /*Codebypp_orange*/#include<bits/stdc++.h>#definem_p(a,b)make_pair(a,b)#definepbpush_back#definelllonglong#defineullunsignedlonglong#definelldlongdouble#defineinf0x7FFFFFFF#defineinff9223372036854775807#definerep(i,l,......
  • wpf 自定义按钮模板
    <ButtonWidth="300"Height="100"Content="自定义按钮"Background="Bisque"FontSize="23"Foreground="Orchid"><Button.Template><ControlTemplateTargetType=&qu......
  • 设计模式—结构型模式之享元模式
    设计模式—结构型模式之享元模式享元模式(FlyweightPattern),运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。对象结构型。在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外......
  • JavaSE面试题02:单例设计模式
    单例模式来源:https://www.runwsh.com/archives/biitngg1f7s00001.什么事Singleton?Singleton:在Java中即指单例设置模式,探视软件开发最常用的设置模式之一通俗解释:单例模式单:唯一例:实例单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式......
  • 学习随笔(设计模式:建造者模式)
    内容今天学习了建造者模式。1.建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。2.简单来说就是一个类的所有的特性方法与这个类对象的构建分离3.本来觉得有点类似于工厂模式,但细想又不太一样。工厂模式是创建一个类,这个类用来创新用户......
  • 设计模式-享元模式
    参考:https://blog.csdn.net/shuai_h/article/details/129701459概述-运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。优缺点优点极大减少内存中相似或相同对象......
  • 虚拟机桥接模式(网络渗透测试2)
    题目:1、Kali虚拟机采用桥接模式;物理机连接Guet-WiFi,Kali中查看网络配置并截图,能获得IP地址吗?2、Kali虚拟机采用桥接模式;物理机连接手机热点,Kali中查看网络配置并截图,能获得IP地址吗?3、对于1、2的结果,进行总结分析。首先我们需要知道桥接模式,桥接模式即将主机网卡与虚拟机的网卡......
  • 抽象工厂模式
    [实验任务一]:人与肤色使用抽象工厂模式,完成下述产品等级结构:画出对应的类图;提交源代码;Black.javapackagePeopleAndSkinColor;publicclassBlackimplementsColor{@OverridepublicManproduceMan(){returnnewBlackMan();}@Override......