C++设计模式——Composite 组合模式

Composite objects into a tree structure so that individual objects and compositions of objects can be treated uniformly.

组合模式用于将对象(s)组合成一个树形结构,来表示部分-整体的层次关系(part-whole hierarchy),该设计模式允许客户以一个统一的方式对待每一个独立的对象或者由对象构成的容器(也即无论是独立的对象——叶子/部分/part,还是由这些对象组成的容器/whole,均继承自某一共同的抽象基类,获得相同的接口)。例如,我们磁盘上的文件/文件夹,即是这样一种结构。

实现上:

  • (1)叶子节点(LeafNode):存储数据,不具备分支
  • (2)内部节点(InternalNode):不存储数据,具备分支
  • (3)叶子节点和内部节点,继承自统一的基类(Node)

含义上:

  • (1)形成了局部-整体(part-whole)的递归结构



组合设计模式的 UML 类图如下:


这里写图片描述

现在我们用组合设计模式,模拟文件/文件夹的目录结构。如刻画如下的目录结构:


这里写图片描述

class Component
{
public:
    virtual ~Component() {}
    virtual void traverse() = 0;
};

// 这里的继承
// 仅仅是获得统一的接口,也即是traverse,并无实际意义上的继承关系
class File :public Component
{
public:
    File(const std::string& name):_name(name){}
    void traverse() { std::cout << _name << ", "; }
private:
    std::string _name;
};

// 同样这里的继承
// 仅仅是获得统一的接口,也即traverse,并无实际意义上的继承关系
class Folder :public Component
{
public:
    void add(Component* item)
    { _children.push_back(item); }
    void traverse()
    {
        for (auto elem: _children)
            elem->traverse();
    }
private:
    std::vector<Component*> _children;
};

int main(int, char**)
{
    Folder d1, d2;
    File f1("file_1");
    File f2("file_2");
    File f3("file_3");
    File f4("file_4");

    d1.add(&f1);
    d1.add(&f2);
    d1.add(&d2);
    d2.add(&f3);
    d2.add(&f4);

    d1.traverse();
    std::cout << std::endl;

    return 0;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值