美文网首页
设计模式-结构模式-组合模式

设计模式-结构模式-组合模式

作者: 阿棍儿_Leon | 来源:发表于2020-04-29 14:53 被阅读0次

组合模式就是把子类继承关系搞成树形结构,类似于组织结构图,体现整体与部分的关系。

以下代码定义节点抽象类,整个树的节点都继承此类。

#include <iostream>
#include <vector>

using namespace std;

class Node
{
public:
    int Level;
    Node():Level(0){}
    virtual ~Node(){};
    virtual void Operation()=0;
    virtual void Add(Node* component)=0;
    virtual void Remove(Node* component)=0;
    virtual Node* GetChild(int index)=0;
};

以下代码定义了叶子节点类,它不能添加子节点,只能被添加为子节点。

class Leaf:public Node
{
public:
    void Operation()
    {
        cout<<"level="<<Level<<","<<__PRETTY_FUNCTION__<<endl<<endl;
    }
    void Add(Node* component){}
    void Remove(Node* component){}
    Node* GetChild(int index){return nullptr;}
};

以下代码定义了中间节点类,中间节点可以添加子节点。

class Composite:public Node
{
private:
    vector<Node*> m_pChildren;
public:
    void Operation()
    {
        cout<<"level="<<Level<<","<<__PRETTY_FUNCTION__<<endl;
        for (vector<Node*>::iterator it = m_pChildren.begin(); it != m_pChildren.end();++it)
        {
            if (*it != nullptr)
            {
                (*it)->Operation();
            }
        }
    }
    void Add(Node* component)
    {
        m_pChildren.push_back(component);
        if (component->Level <= Level)
        {
            component->Level = Level + 1;
        }
    }
    void Remove(Node* component)
    {
        for (vector<Node*>::iterator it = m_pChildren.begin(); it != m_pChildren.end();++it)
        {
            if (*it == component)
            {
                if (*it != nullptr)
                {
                    delete *it;
                }
                m_pChildren.erase(it);
                break;
            }
        }
    }
    Node* GetChild(int index)
    {
        if (index >= m_pChildren.size() || index < 0)
        {
            return nullptr;
        }
        return m_pChildren[index];
    }
};

以下代码演示了组合模式,首先创建了“根、枝、叶”节点,然后连接它们,最后打印出他们的层级关系。

int main(void){
    Node* root = new Composite();
    Node* branch = new Composite();
    Node* leaf = new Leaf();
    root->Add(branch);
    branch->Add(leaf);
    root->Operation();
    branch->Operation();
    leaf->Operation();
    delete root;
    delete branch;
    delete leaf;
    return 0;
}```
输出
```python
level=0,virtual void Composite::Operation()
level=1,virtual void Composite::Operation()
level=2,virtual void Leaf::Operation()

level=1,virtual void Composite::Operation()
level=2,virtual void Leaf::Operation()

level=2,virtual void Leaf::Operation()

相关文章

  • 8、结构型模式-组合设计模式

    1、将对象组合成树形结构的模式-组合设计模式 组合设计模式又叫部分整体模式,将对象组合成树形结构以表示“部分-整体...

  • 组合模式

    设计模式之组合模式 什么是组合模式? 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以...

  • 设计模式[11]-组合模式-Composite Pattern

    1. 组合模式简介 组合模式(Composite Pattern)是结构性设计模式,又叫“部分-整体”模式,主要用...

  • JS设计模式-其他1-原型模式 & 桥接模式

    其他设计模式系列开始介绍前端不常用的设计模式有哪些设计模式? 创建性模式原型模式 结构型模式桥接模式 组合模式 ...

  • 组合模式

    设计模式 一、什么是组合模式 组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“...

  • Android设计模式之(19)----组合模式

    组合模式 组合模式属于结构型设计模式. 组合模式又可叫做【部分-整体】模式.它将部分与整体的关系通过树的形式表现出...

  • Android设计模式——组合模式(七大结构型)

    1.组合模式介绍 组合模式(Composite Pattern)也称为部分整体模式,是七大结构型设计模式之...

  • Java设计模式<组合模式>

    Java设计模式<组合模式> 意图 对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和...

  • 设计模式-组合模式(十二)

    结构型设计模式 12.组合模式 组合模式又称“整体-部分”设计模式,让整体与部分的使用具有一致性。 12.1创建抽...

  • Android设计模式(十八)-组合模式

    组合模式,也称作部分整体模式。是结构型设计模式之一。组合模式画成图就是数据结构中的树结构,有一个根节点,然后有很多...

网友评论

      本文标题:设计模式-结构模式-组合模式

      本文链接:https://www.haomeiwen.com/subject/gangwhtx.html