[学习][笔记]设计模式(基于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) .

相关文章
|
2天前
|
C++
c++的学习之路:27、红黑树
c++的学习之路:27、红黑树
32 4
|
2天前
|
Java C++
C++的学习之路:21、继承(2)
C++的学习之路:21、继承(2)
18 0
|
2天前
|
存储 C++ 容器
c++的学习之路:26、AVL树
c++的学习之路:26、AVL树
29 0
|
2天前
|
编译器 C++
c++的学习之路:22、多态(1)
c++的学习之路:22、多态(1)
21 0
c++的学习之路:22、多态(1)
|
2天前
|
安全 编译器 程序员
c++的学习之路:20、继承(1)
c++的学习之路:20、继承(1)
29 0
|
2天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
8 1
|
2天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
16 0
|
2天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
17 0
【C++】string学习 — 手搓string类项目
|
2天前
|
编译器 C语言 C++
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
23 0
|
2天前
|
安全 Java 程序员
【C++笔记】从零开始认识继承
在编程中,继承是C++的核心特性,它允许类复用和扩展已有功能。继承自一个基类的派生类可以拥有基类的属性和方法,同时添加自己的特性。继承的起源是为了解决代码重复,提高模块化和可维护性。继承关系中的类形成层次结构,基类定义共性,派生类则根据需求添加特有功能。在继承时,需要注意成员函数的隐藏、作用域以及默认成员函数(的处理。此外,继承不支持友元关系的继承,静态成员在整个继承体系中是唯一的。虽然多继承和菱形继承可以提供复杂的设计,但它们可能导致二义性、数据冗余和性能问题,因此在实际编程中应谨慎使用。
18 1
【C++笔记】从零开始认识继承