C++设计模式-组合模式

 

介绍

  • Component抽象构件角色
    定义参加组合对象的共有方法和属性, 可以定义一些默认的行为或属性。
  • Leaf叶子构件
    叶子对象, 其下再也没有其他的分支, 也就是遍历的最小单位。
  • Composite树枝构件
    树枝对象, 它的作用是组合树枝节点和叶子节点形成一个树形结构

透明组合模式中,抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、remove()以及getChild()等方法,这样做的好处是确保所有的构件类都有相同的接口。此模式中Component、Leaf、Composite均需要实现所有方法,对于leaf实际上add等方法是无意义的,但对于client来说不需要区分Leaf和Composite。

安全组合模式中,在抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法。

优点: 高层模块调用简单;节点自由增加

缺点: 树叶和树枝使用实现类,不符合依赖倒置

应用:维护和展示部分–整体关系的场景,如树形菜单、文件和文件夹管理;从一个整体中能够独立出部分模块或功能的场景。

范例

#ifndef COMPONENT_H
#define COMPONENT_H
class Component {
//个体和整体都具有的共享
public:
    virtual ~Component() { }
    virtual void doSomething() = 0;
};
#endif // COMPONENT_H
#ifndef COMPOSITE_H
#define COMPOSITE_H
#include <QList>
#include "component.h"
class Composite : public Component {
public:
    ~Composite() {
        for(auto component : componentArrayList) {
            delete component;
        }
    }
    void doSomething() override { }
    //增加一个叶子构件或树枝构件
    void add(Component *component){
        componentArrayList.append(component);
    }
    //删除一个叶子构件或树枝构件
    void remove(Component *component){
        delete component;
        componentArrayList.removeOne(component);
    }
    //获得分支下的所有叶子构件和树枝构件
    QList<Component *> getChildren(){
        return componentArrayList;
    }
//构件容器
private:
    QList<Component *> componentArrayList;
};
#endif // COMPOSITE_H
#ifndef LEAF_H
#define LEAF_H
#include "component.h"
class Leaf : public Component {
public:
    void doSomething() override { }
};
#endif // LEAF_H
#include "composite.h"
#include "leaf.h"
int main(int argc, char *argv[]) {
    Composite *root = new Composite();
    root->doSomething();
    //创建一个树枝构件
    Composite *branch = new Composite();
    //创建一个叶子节点
    Leaf *leaf = new Leaf();
    //建立整体
    root->add(branch);
    branch->add(leaf);
    //父节点析构会删除子节点
    delete root;
}

源码GitHub:CppDesignPattern
相关链接:C++设计模式

Techie亮博客,转载请注明:Coologic » C++设计模式-组合模式

Coologic 博客域名已更改,已从 www.techieliang.com 改为 www.coologic.cn,上述链接地址受到影响,若需查看源文请手动修改,多有不便,敬请谅解。
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值