简单介绍
装饰模式是一种结构型设计模式,当你需要在一个类里扩展一个或者额外添加一个新行为,可以用装饰模式在原有基础上加一层 " 装饰 "
开发时遇到的问题
例如你有一个开发一个提供通知功能的库, 其他程序可使用它向用户发送关于重要事件的通知
但是用户会在使用中希望添加许多功能。
(有的用户希望在微信上接收消息, 有的用户则希望在 QQ 上接收消息,有的希望两个都接收)
这时候如果盲目使用继承扩展通知类就会导致代码量膨胀。
继承也会引发一些问题:
- 继承是静态的。 你无法在运行时更改已有对象的继承关系, 只能使用由不同子类创建的对象来替代当前的整个对象。
- 子类只能有一个父类。 大部分编程语言不允许一个类同时继承多个类的行为。
有一种方法是使用聚合或组合 , 两者的工作方式几乎一模一样: 一个对象包含指向另一个对象的引用, 并将部分工作委派给引用对象; 继承中的对象则继承了父类的行为, 它们自己能够完成这些工作。
这时候就可以引入装饰模式的思想:装饰器连接其他目标对象(上述的扩展的功能类),包含目标对象的方法(在微信上接收消息),会将所有接收到的请求委派给目标对象,并且可以在委派前后对请求进行处理。可能会改变最终结果。
客户端无法分辨是通知类Notifier 还是装饰器BaseDecorator 使用了通用的接口,减少耦合
UML图
实现方式
确保业务逻辑可用一个基本组件及多个额外可选层次表示。(咖啡为基本组件,选择添加的东西为可选层次)
以下代码主要注意继承关系以及 聚合关系
#include <iostream>
#include <bits/stdc++.h>
// 装饰模式
using namespace std;
// 当子类有相同的字段,需要向上提,(可以设置一个中间类)
class coffee
{
public:
coffee() {
}
virtual string desc() = 0;
virtual int money() = 0;
~coffee()