[学习][笔记]设计模式(基于C/C++实现)<五>装饰器模式

简介: 设计模式(基于C/C++实现)<五>装饰器模式

文章目录



装饰器模式


定义

允许向一个现有的对象添加新的功能,同时又不改变结构. 属于结构型模式,作为现有类的一个包装.

使用场景

扩展一个类的功能;

动增加功能,动态撤销.

基本思路

1、component组件 为抽象,具体组件(concrete_component),装饰器件(decorator)都需要继承

2、具体组件传入到 具体装饰器中 进行加工。

实例

一家饮料店出售(component)咖啡(concrete_component)、茶(concrete_component)等,另外可以根据客户需求添加不同的调料(decorator)比如摩卡(concrete_decorator)、奶昔(concrete_decorator)等,因此可能的饮料有摩卡咖啡、双倍奶昔咖啡等,在结算时就要同时计算调料和饮料的价格。

//beverage.h
#ifndef BEVERAGE_H
#define BEVERAGE_H
#include <string>
using namespace std;
class Bervage{
public:
    virtual string getDescription(){
        return description;
    }
    virtual double cost()=0;
protected:
    string description;
};
#endif // BEVERAGE_H
//beverage_espresso.h
#ifndef BEVERAGE_ESPRESSO_H
#define BEVERAGE_ESPRESSO_H
#include "beverage.h"
/**** 具体的饮料类 ****/
class Espresso:public Bervage{
public:
    Espresso(){
        description = " Espresso ";
    }
    double cost(){
        return 1.99;
    }
};
#endif // BEVERAGE_ESPRESSO_H
//beverage_tea.h
#ifndef BEVERAGE_TEA_H
#define BEVERAGE_TEA_H
#include "beverage.h"
class Tea:public Bervage{
public:
    Tea(){
        description = " Tea ";
    }
    double cost(){
        return 1.05;
    }
};
#endif // BEVERAGE_TEA_H
//condiment_mocha.h
#ifndef CONDIMENT_MOCHA_H
#define CONDIMENT_MOCHA_H
#include "decorator_condiment.h"
/**** 具体的调料类 ****/
class Mocha:public CondimentDecorator{
public:
    Mocha(Bervage *ptr){
        pBervage = ptr;
    }
    string getDescription(){
        return " Mocha "+pBervage->getDescription();
    }
    double cost(){
        return 0.2+pBervage->cost();
    }
};
#endif // CONDIMENT_MOCHA_H
//condiment_whip.h
#ifndef CONDIMENT_WHIP_H
#define CONDIMENT_WHIP_H
#include "decorator_condiment.h"
class Whip:public CondimentDecorator{
public:
    Whip(Bervage *ptr){
        pBervage = ptr;
    }
    string getDescription(){
        return " Whip "+pBervage->getDescription();
    }
    double cost(){
        return 0.5+pBervage->cost();
    }
};
#endif // CONDIMENT_WHIP_H
//decorator_condiment.h
#ifndef DECORATOR_CONDIMENT_H
#define DECORATOR_CONDIMENT_H
#include "beverage.h"
class CondimentDecorator:public Bervage{
protected:
    Bervage *pBervage;
};
#endif // DECORATOR_CONDIMENT_H
//main.cpp
#include <iostream>
#include "beverage_espresso.h"
#include "beverage_tea.h"
#include "condiment_mocha.h"
#include "condiment_whip.h"
using namespace std;
int main()
{
    Espresso esp;
    Mocha mocha(&esp);
    cout<<mocha.cost()<<endl;
    cout<<mocha.getDescription()<<endl;
    Mocha dmocha(&mocha);
    cout<<dmocha.cost()<<endl;
    cout<<dmocha.getDescription()<<endl;
    Whip wdmocha(&dmocha);
    cout<<wdmocha.cost()<<endl;
    cout<<wdmocha.getDescription()<<endl;
    return 0;
}
输出:
2.19
 Mocha  Espresso 
2.39
 Mocha  Mocha  Espresso 
2.89
 Whip  Mocha  Mocha  Espresso 

总结

demo地址

适配器模式/装饰模式/代理模式的区别?

适配器的特点在于兼容: 是将一个类(a)通过某种方式转换成另一个类(b);

装饰器模式特点在于增强: 在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b);

代理模式的特点在于隔离: 将一个类(a)转换成具体的操作类(b) .

相关文章
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
158 0
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
301 0
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
234 3
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
322 4
2023/11/10学习记录-C/C++对称分组加密DES
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
200 16
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
330 16
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
557 6
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
177 1
|
设计模式 Java
Java设计模式-装饰器模式(10)
Java设计模式-装饰器模式(10)
143 2
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
242 1