虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > C/C++编程 > C++设计模式之组合模式(Composite)

C++设计模式之组合模式(Composite)
类别:C/C++编程   作者:码皇   来源:互联网   点击:

这篇文章主要为大家详细介绍了C++设计模式之组合模式Composite,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

组合模式为了描述分支包含关系,也就是我们说的树形关系,其对象分为枝和叶,每一枝可包含枝和叶,直到全部为叶节点。我们对枝和叶进行行为抽象,可认为枝和叶都是Component,而叶是最小的操作单元,其下不存在枝和叶,而枝作为Composite里面存有其下枝和叶的组件列表。

作用

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性

类视图

实现

    #include <iostream>#include <list>#include <string>using namespace std;
    class menu{
    public: menu(string in) : name(in){
    }
    ~menu(){
    }
    virtual void Add(menu*) = 0;
    virtual void Remove(menu*) = 0;
    virtual void showname() = 0;
    protected: string name;
    }
    ;
    class Leafmenu : public menu{
    public: Leafmenu(string in) : menu(in){
    }
    ~Leafmenu(){
    }
    void showname() {
    cout<< "Leaf : " << name << endl;
    }
    virtual void Add(menu*){
    }
    virtual void Remove(menu*){
    }
    }
    ;
    class Compositemenu : public menu{
    public: Compositemenu(string in) : menu(in){
    }
    void showname() {
    cout<< "Composit : "<< name << endl;
    list<menu*>::iterator iter = m_child.begin();
    while (iter != m_child.end()) {
    (*iter)->showname();
    iter++;
    }
    }
    virtual void Add(menu*m){
    m_child.push_back(m);
    }
    virtual void Remove(menu*m){
    m_child.remove(m);
    }
    private: list<menu*> m_child;
    }
    ;
    //调用实现int main{
    Compositemenu mainmenu("Main");
    /***添加File菜单****/ Compositemenu *pFile = new Compositemenu("File");
    Leafmenu *pNew = new Leafmenu("New");
    Leafmenu *pOpen = new Leafmenu("Open");
    Leafmenu *pClose = new Leafmenu("Close");
    pFile->Add(pNew);
    pFile->Add(pOpen);
    pFile->Add(pClose);
    mainmenu.Add(pFile);
    /***添加Edit菜单****/ Compositemenu *pEdit = new Compositemenu("Edit");
    Leafmenu *pCopy = new Leafmenu("Copy");
    Leafmenu *pPaste = new Leafmenu("Paste");
    pEdit->Add(pCopy);
    pEdit->Add(pPaste);
    mainmenu.Add(pFile);
    Leafmenu *pExit = new Leafmenu("Exit");
    Leafmenu *pHelp = new Leafmenu("Help");
    mainmenu.Add(pExit);
    mainmenu.Add(pHelp);
    mainmenu.showname();
    delete pNew;
    delete pOpen;
    delete pClose;
    delete pFile;
    delete pCopy;
    delete pPaste;
    delete pEdit;
    delete pExit;
    delete pHelp;
    }

关于叶对节点的操作方法,如上面例子中add、remove、get等,其实是不需要的,因为基类申明的是纯虚函数,所以必须进行实现,但是在调用时没有任何意义,这就带来了一些使用的风险,安全的做法是将这些操作从基类中移除,添加到composite类中,这样在编译时就可以检查到调用问题,不过这样做显然又阻碍了接口的一致性,权衡利弊的选择还需自己根据需要来。

应用场景

常用的树形结构操作,如文件结构、菜单、组织结构等

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • 设计模式中的备忘录模式解析及相关C++实例应用
  • C++设计模式之备忘录模式
  • C++设计模式之桥接模式(Bridge)
  • C++设计模式之享元模式(Flyweight)
  • C++设计模式之策略模式(Strategy)
  • C++设计模式之模板方法模式(TemplateMethod)
  • C++设计模式之观察者模式(Observer)
  • C++设计模式之迭代器模式(Iterator)
  • C++设计模式之适配器模式(Adapter)
  • C++设计模式之备忘录模式(Memento)
相关热词搜索: C++ 设计模式 组合模式