C++ 【装饰模式】

简单介绍

装饰模式是一种结构型设计模式,当你需要在一个类里扩展一个或者额外添加一个新行为,可以用装饰模式在原有基础上加一层 " 装饰 "

开发时遇到的问题

例如你有一个开发一个提供通知功能的库, 其他程序可使用它向用户发送关于重要事件的通知
但是用户会在使用中希望添加许多功能。
(有的用户希望在微信上接收消息, 有的用户则希望在 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() 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值