首页 > 其他分享 >结构型模式-装饰模式

结构型模式-装饰模式

时间:2023-11-10 13:45:35浏览次数:30  
标签:Coffee return getDescription 模式 public cost 装饰 结构型

1 什么是装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许将新功能动态地添加到对象中,通过将对象放入特殊的包装对象中,这样可以在不改变其接口的情况下,对对象的功能进行逐步扩展。
在装饰模式中,通常包括以下几个角色:抽象构件(Component)、具体构件(Concrete Component)、抽象装饰者(Decorator)和具体装饰者(Concrete Decorator)。抽象构件定义了对象的接口,具体构件是被装饰的对象,抽象装饰者和具体装饰者用于对具体构件进行装饰。

2 举个例子

以下是一个简单的装饰模式示例:假设我们有一个咖啡店,其中有原味咖啡和各种调料(如牛奶、糖、摩卡)。我们可以使用装饰模式为咖啡动态地添加不同的调料而不改变原味咖啡的接口。

首先,我们定义抽象构件 Coffee。它可以是一个抽象类或接口,代表了原味咖啡:

class Coffee {
public:
    virtual std::string getDescription() = 0;
    virtual double cost() = 0;
};

然后,我们创建具体构件 SimpleCoffee,它是原味咖啡:

class SimpleCoffee : public Coffee {
public:
    std::string getDescription() {
        return "Simple Coffee";
    }

    double cost() {
        return 1.0; // 原味咖啡的价格
    }
};

接下来,我们定义抽象装饰者 CoffeeDecorator:

class CoffeeDecorator : public Coffee {
protected:
    Coffee* decoratedCoffee;

public:
    CoffeeDecorator(Coffee* coffee) : decoratedCoffee(coffee) {}

    virtual std::string getDescription() {
        return decoratedCoffee->getDescription();
    }

    virtual double cost() {
        return decoratedCoffee->cost();
    }
};

最后,我们创建具体装饰者,比如 Milk, Sugar 和 Mocha 等:

class Milk : public CoffeeDecorator {
public:
    Milk(Coffee* coffee) : CoffeeDecorator(coffee) {}

    std::string getDescription() {
        return decoratedCoffee->getDescription() + ", Milk";
    }

    double cost() {
        return decoratedCoffee->cost() + 0.5; // 加牛奶的价格
    }
};

class Sugar : public CoffeeDecorator {
public:
    Sugar(Coffee* coffee) : CoffeeDecorator(coffee) {}

    std::string getDescription() {
        return decoratedCoffee->getDescription() + ", Sugar";
    }

    double cost() {
        return decoratedCoffee->cost() + 0.2; // 加糖的价格
    }
};

class Mocha : public CoffeeDecorator {
public:
    Mocha(Coffee* coffee) : CoffeeDecorator(coffee) {}

    std::string getDescription() {
        return decoratedCoffee->getDescription() + ", Mocha";
    }

    double cost() {
        return decoratedCoffee->cost() + 0.3; // 加摩卡的价格
    }
};

客户端代码可以这样使用装饰模式:

int main() {
    Coffee* simpleCoffee = new SimpleCoffee();
    std::cout << "Description: " << simpleCoffee->getDescription() << ", Cost: " << simpleCoffee->cost() << std::endl;

    Coffee* milkCoffee = new Milk(simpleCoffee);
    std::cout << "Description: " << milkCoffee->getDescription() << ", Cost: " << milkCoffee->cost() << std::endl;

    Coffee* mochaSugarCoffee = new Mocha(new Sugar(simpleCoffee));
    std::cout << "Description: " << mochaSugarCoffee->getDescription() << ", Cost: " << mochaSugarCoffee->cost() << std::endl;

    delete simpleCoffee;
    delete milkCoffee;
    delete mochaSugarCoffee;

    return 0;
}

输出如下内容:

Description: Simple Coffee, Cost: 1
Description: Simple Coffee, Milk, Cost: 1.5
Description: Simple Coffee, Milk, Sugar, Mocha, Cost: 2

在第一个输出中,我们使用原味咖啡(SimpleCoffee),其描述为 “Simple Coffee”,价格为 1。
在第二个输出中,我们使用了装饰者 Milk 对原味咖啡进行装饰,因此描述变为 “Simple Coffee, Milk”,价格变为 1 + 0.5 = 1.5。
在第三个输出中,我们首先使用装饰者 Sugar 对原味咖啡进行装饰,得到 “Simple Coffee, Sugar”,然后再使用装饰者 Mocha 对上一次装饰的结果进行装饰,得到最终的描述 “Simple Coffee, Milk, Sugar, Mocha”,价格为 1 + 0.5 + 0.2 + 0.3 = 2。
在上面的例子中,我们使用装饰模式为原味咖啡动态地添加牛奶、糖、摩卡等调料,而不需要改变原味咖啡的接口。这样,我们可以灵活地组合不同的调料,以获得不同口味的咖啡。

3 总结

通过装饰模式,我们实现了对对象功能的动态扩展,同时保持了对象接口的一致性。

标签:Coffee,return,getDescription,模式,public,cost,装饰,结构型
From: https://www.cnblogs.com/luoxiang/p/17823901.html

相关文章

  • 结构型模式-桥接模式
    1什么是桥接模式桥接模式(BridgePattern)是一种用于将抽象部分与它的实现部分分离的设计模式,使它们可以独立地变化。桥接模式通过组合而不是继承的方式来实现两个或多个独立变化的维度,从而减少类之间的耦合性。在桥接模式中,存在两种角色:抽象部分(Abstraction)和实现部分(Implemento......
  • Go 设计模式中中介者模式
    鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen) 中介者模式原理详细解释:中介者模式(MediatorPattern)是一种行为型设计模式,用于降低多个对象之间的直接通信,并使......
  • Go 设计模式中观察者模式
    鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)          观察者模式原理详细解释:观察者模式(ObserverPattern)是一种行为型设计模式,它定义了......
  • 行为模式-责任链模式
    1什么是责任链模式责任链模式(ChainofResponsibilityPattern)是一种行为设计模式,用于建立一个对象链,每个对象都有机会处理请求。请求沿着对象链传递,直到有一个对象能够处理它为止。这样,责任链模式将请求的发送者和接收者解耦,动态确定处理请求的对象。在责任链模式中,通常有两种......
  • 结构型模式-享元模式
    1什么是享元模式享元模式(FlyweightPattern)是一种以共享对象来减少内存使用和提高性能的设计模式。在享元模式中,通过共享尽可能多的相似对象来减少系统中对象的数量。这样可以节省内存和减少对象的创建和销毁所带来的开销。享元模式的核心思想是将对象分为两个部分:内部状态(Intr......
  • 《流畅的Python》 读书笔记 第7章_函数装饰器和闭包
    第7章函数装饰器和闭包装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包如果你想自己实现函数装饰器,那就必须了解闭包的方方面面,因此也就需......
  • 解锁设计模式的神秘面纱:编写无懈可击的代码之单例设计模式
    前言单例设计模式是23种设计模式中最常用的设计模式之一,无论是三方类库还是日常开发几乎都有单例设计模式的影子。单例设计模式提供了一种在多线程情况下保证实例唯一性的解决方案。单例设计模式虽然简单,但是实现方案却非常多,大体上有以下7种最常见的方式。饿汉模式所谓饿汉式,就是......
  • 工厂方法模式
    [实验任务]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。 publicinterfaceEncryption{Stringencrypt(Stringtext);Stringdecrypt(Stringciph......
  • python升级到3.12版本, 开发模式安装包, 在vscode下Pylance无法解析的问题处理
    问题描述在python3.11版本下开发python库,为方便调测,使用开发模式安装包.使用如下命令:pipinstall-e.其中-e参数表示开发模式下安装python包,它并没有把包相关文件拷贝到site-packages目录,而是创建一个链接指向当前的开发库.这样,当自己开发的包修改后会立即生效,......
  • Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
    Go接口:Go中最强大的魔法,接口应用模式或惯例介绍目录Go接口:Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1一切皆组合2.2垂直组合2.2.1第一种:通过嵌入接口构建接口2.2.2第二种:通过嵌入接口构建结构体类型2.2.3第三种:通过嵌入结构体类型构建新结构......