用c++ 实现一个装饰者模式的demo
时间: 2024-05-13 07:18:27 浏览: 20
好的,以下是一个简单的装饰者模式的demo:
```cpp
#include <iostream>
#include <string>
using namespace std;
// 抽象组件
class Beverage {
public:
virtual string getDescription() = 0;
virtual double cost() = 0;
};
// 具体组件
class Espresso : public Beverage {
public:
string getDescription() {
return "Espresso";
}
double cost() {
return 1.99;
}
};
// 抽象装饰者
class CondimentDecorator : public Beverage {
public:
virtual string getDescription() = 0;
};
// 具体装饰者
class Mocha : public CondimentDecorator {
private:
Beverage* beverage;
public:
Mocha(Beverage* b) {
beverage = b;
}
string getDescription() {
return beverage->getDescription() + ", Mocha";
}
double cost() {
return 0.20 + beverage->cost();
}
};
int main() {
// 没有装饰的 Espresso
Beverage* espresso = new Espresso();
cout << espresso->getDescription() << " $" << espresso->cost() << endl;
// 加了 Mocha 的 Espresso
Beverage* mochaEspresso = new Mocha(espresso);
cout << mochaEspresso->getDescription() << " $" << mochaEspresso->cost() << endl;
return 0;
}
```
在这个例子中,`Beverage` 是抽象组件,`Espresso` 是具体组件。`CondimentDecorator` 是抽象装饰者,`Mocha` 是具体装饰者。
我们通过 `Espresso` 和 `Mocha` 这两个类来演示装饰者模式。`Espresso` 是一种饮料,它实现了 `Beverage` 接口。`Mocha` 是一种装饰者,它也实现了 `Beverage` 接口,并且在内部持有一个 `Beverage` 对象。
在 `Mocha` 类中,我们通过构造函数接收一个 `Beverage` 对象,并在 `getDescription` 和 `cost` 方法中分别调用它的方法,并加上自己的描述和价格。
在 `main` 函数中,我们首先创建了一个 `Espresso` 对象,并输出它的描述和价格。然后,我们创建了一个 `Mocha` 对象,将 `Espresso` 对象作为参数传入,再次输出描述和价格。可以看到,`Mocha` 对象的描述是 `Espresso, Mocha`,价格是 `2.19`,即 `Espresso` 的价格加上 `Mocha` 的价格。这就是装饰者模式的作用:动态地给对象添加职责。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)