zoukankan      html  css  js  c++  java
  • 设计模式-组合模式

    组合模式(Composite)的定义为:组合多个对象形成树形结构,以表示整体-部分的结构层次。组合模式对单个对象和组合对象的使用具有一致性。其结构图如下:
     

    例如一个新闻的树形菜单,它包含很多原始菜单(如国内、国际),以及由其子菜单组成的组合节点(如国内新闻下的时事、社会等),结构图如下:


    实现代码:

    //Menu.h
    #include <string>

    class Menu  
    {
    public:
        
    virtual ~Menu();

        
    virtual void Add(Menu*);
        
    virtual void Remove(Menu*);
        
    virtual Menu* GetChild(int);
        
    virtual void Display() = 0;
    protected:
        Menu();
        Menu(std::
    string);
        std::
    string m_strName;
    };

    //Menu.cpp
    #include "stdafx.h"
    #include 
    "Menu.h"

    Menu::Menu()
    {

    }

    Menu::Menu(std::
    string strName) : m_strName(strName)
    {

    }

    Menu::
    ~Menu()
    {

    }

    void Menu::Add(Menu* pMenu)
    {}

    void Menu::Remove(Menu* pMenu)
    {}

    Menu
    * Menu::GetChild(int index)
    {
        
    return NULL;
    }

    //SubMenu.h
    #include "Menu.h"

    class SubMenu : public Menu  
    {
    public:
        SubMenu();
        SubMenu(std::
    string);
        
    virtual ~SubMenu();

        
    void Display();
    };

    //SubMenu.cpp
    #include "stdafx.h"
    #include 
    "SubMenu.h"
    #include 
    <iostream>

    using namespace std;

    SubMenu::SubMenu()
    {

    }

    SubMenu::SubMenu(
    string strName) : Menu(strName)
    {

    }

    SubMenu::
    ~SubMenu()
    {

    }

    void SubMenu::Display()
    {
        cout 
    << m_strName << endl;
    }

    //CompositMenu.h
    #include "Menu.h"
    #include 
    <vector>

    class CompositMenu : public Menu
    {
    public:
        CompositMenu();
        CompositMenu(std::
    string);
        
    virtual ~CompositMenu();

        
    void Add(Menu*);
        
    void Remove(Menu*);
        Menu
    * GetChild(int);
        
    void Display();
    private:
        std::vector
    <Menu*> m_vMenu;
    };

    //CompositMenu.cpp
    #include "stdafx.h"
    #include 
    "CompositMenu.h"
    #include 
    <iostream>

    using namespace std;

    CompositMenu::CompositMenu()
    {
        
    }

    CompositMenu::CompositMenu(
    string strName) : Menu(strName)
    {

    }

    CompositMenu::
    ~CompositMenu()
    {

    }

    void CompositMenu::Add(Menu* pMenu)
    {
        m_vMenu.push_back(pMenu);
    }

    void CompositMenu::Remove(Menu* pMenu)
    {
        m_vMenu.erase(
    &pMenu);
    }

    Menu
    * CompositMenu::GetChild(int index)
    {
        
    return m_vMenu[index];
    }

    void CompositMenu::Display()
    {
        cout 
    << "+" << m_strName << endl;
        vector
    <Menu*>::iterator it = m_vMenu.begin();
        
    for (; it != m_vMenu.end(); ++it)
        {
            cout 
    << "|-";
            (
    *it)->Display();
        }
    }

    #include 
    "stdafx.h"
    #include 
    "Menu.h"
    #include 
    "SubMenu.h"
    #include 
    "CompositMenu.h"

    int main(int argc, char* argv[])
    {
        Menu
    * pMenu = new CompositMenu("国内新闻");
        pMenu
    ->Add(new SubMenu("时事新闻"));
        pMenu
    ->Add(new SubMenu("社会新闻"));
        pMenu
    ->Display();
        pMenu 
    = new CompositMenu("国际新闻");
        pMenu
    ->Add(new SubMenu("国际要闻"));
        pMenu
    ->Add(new SubMenu("环球视野"));
        pMenu
    ->Display();

        
    return 0;
    }


    最后输出为:
    +国内新闻
    |-时事新闻
    |-社会新闻
    +国际新闻
    |-国际要闻
    |-环球视野

  • 相关阅读:
    那些年搞不懂的多线程、同步异步及阻塞和非阻塞(二)---概念区分
    那些年搞不懂的多线程、同步异步及阻塞和非阻塞(一)---多线程简介
    websocket简单实例
    map对象拷贝问题
    【简单算法】44.位1的个数
    【简单算法】43.罗马数字转整数
    【简单算法】42. 3的幂
    【简单算法】41.计数质数
    【简单算法】40.Fizz Buzz
    【简单算法】39.最小栈
  • 原文地址:https://www.cnblogs.com/rosesmall/p/2418325.html
Copyright © 2011-2022 走看看