head first 设计模式装饰着模式C++实现
### 装饰者模式(Decorator Pattern)在C++中的应用与实现 #### 概述 装饰者模式是一种结构型设计模式,它允许在不改变现有对象结构的情况下动态地增加对象的功能。通过创建一个装饰类,它包裹了一个现有的类实例,并在其中添加了新的行为或责任,这样可以灵活地扩展功能而无需修改原有的代码。本文将详细探讨《Head First 设计模式》中介绍的装饰者模式在C++中的具体实现。 #### 装饰者模式的关键概念 装饰者模式主要涉及以下几个关键概念: 1. **组件接口**:定义了被装饰对象的行为。在这个案例中,`Beverage` 类是所有饮料的基础类,提供了 `getDescription()` 和 `cost()` 方法。 2. **具体组件**:实现了组件接口,提供了基本功能。例如,`Espresso`, `HouseBlend`, `DarkRoast` 和 `Decaf` 分别代表了不同的咖啡种类。 3. **装饰者**:也实现了组件接口,并且包含一个对具体组件或其他装饰者的引用。装饰者通过其构造函数接收一个具体组件或另一个装饰者作为参数,从而可以在原有功能的基础上增加新功能。例如,`Mocha`, `Soy`, 和 `Milk` 都是具体的装饰者类,它们为饮料增加了额外的配料。 #### C++实现详解 我们从 `Beverage` 类开始,它是所有饮料的基类,提供了获取描述和计算成本的基本方法。 ```cpp class Beverage { public: Beverage(); virtual ~Beverage(); char* description; char* getDescription(); virtual double cost(); }; ``` 然后,我们定义了一系列具体组件,即各种类型的咖啡: ```cpp class Espresso : public Beverage { public: Espresso() {description = "Espresso";} double cost() {return 1.99;} }; class HouseBlend : public Beverage { public: HouseBlend() {description = "HouseBlendCoffee";} double cost() {return 0.89;} }; // 其他具体组件类似 ``` 接下来,我们定义了装饰者基类 `CondimentDecorator`,它继承自 `Beverage` 并重载了 `getDescription()` 和 `cost()` 方法。每个具体装饰者(如 `Mocha`, `Soy`, `Milk`)都继承自 `CondimentDecorator`,并在构造函数中接收一个 `Beverage` 对象作为参数,以便在原始饮料的基础上添加新的特性。 ```cpp class CondimentDecorator : public Beverage { protected: Beverage* beverage; public: virtual char* getDescription(); virtual double cost(); }; class Mocha : public CondimentDecorator { public: Mocha(Beverage* bev) : CondimentDecorator(bev) {} char* getDescription() {return strcat(beverage->getDescription(), ", Mocha");} double cost() {return 0.20 + beverage->cost();} }; // 其他具体装饰者类似 ``` #### 测试函数 我们通过一个测试函数来验证装饰者模式的效果: ```cpp void main() { Beverage* beverage = new Espresso(); cout << beverage->getDescription() << "$" << beverage->cost() << endl; Beverage* beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); beverage2 = new Milk(beverage2); cout << beverage2->getDescription() << "$" << beverage2->cost() << endl; } ``` 通过这个测试函数,我们可以看到,通过装饰者模式,我们可以在运行时动态地为不同的咖啡类型添加不同的配料,从而极大地提高了系统的灵活性和可扩展性。 #### 总结 装饰者模式在C++中的实现展示了如何在不修改原有代码的基础上,通过动态地增加类的行为来扩展功能。这种模式特别适用于需要在多个层次上进行扩展的情况,使得系统能够更加灵活地应对变化,同时也保持了代码的整洁和模块化。
- 粉丝: 13
- 资源: 77
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助