组合模式

首先做一下声明,这个代码参考了其他博客(http://blog.csdn.net/lcl_data/article/details/8811101)的代码,稍做修改,因为看的那本书,里面是java代码,但是又比较习惯打c++

1.Menu.h

#ifndef MENU 
#define MENU 
#include<string>
#include<iostream>
using namespace std;

class Menu {
public:
    Menu() {}
    Menu(string strName) {
        name = strName;
    }
    virtual ~Menu() {}
    virtual void add(Menu *pMenu) {}
    virtual void remove(Menu *pMenu) {}
    virtual Menu* getChild(int index) {
        return NULL;
    }
    virtual void display() = 0;
protected:
    string name;
};
#endif

2.subMenu.h

#include"Menu.h"
#include<iostream>
#include<string>
using namespace std;

class subMenu : public Menu {
public:
    subMenu() {}
    subMenu(string strName) : Menu(strName) {}
    virtual ~subMenu() {} 
    void display() {
        cout << name << endl;
    }
};

3.compositeMenu.h

#include"Menu.h"
#include<iostream>
#include<vector>
#include<string>
using namespace std;

class compositeMenu:public Menu {
private:
    vector<Menu*> _menu;  // important
public:
    compositeMenu() {}
    compositeMenu(string strName) : Menu(strName) {}
    virtual ~compositeMenu() {}
    void add(Menu* pmenu) {
        _menu.push_back(pmenu);
    }
    void remove(Menu* pmenu) {
        vector<Menu*>::iterator it = _menu.begin();
        for (; it != _menu.end(); ++it) {
            if (*it == pmenu) break;
        }
        _menu.erase(it);
    }
    Menu* getChild(int index) {
        return _menu[index];
    }
    void display() {
        cout << name << endl;
        vector<Menu*>::iterator it = _menu.begin();
        for (; it != _menu.end(); ++it) {
            cout << " -- ";
            (*it)->display();
        }
    }
};

4.main.cpp

#include"subMenu.h"
#include"compositeMenu.h"
int main() {
    Menu* pmenu = new compositeMenu("国内新闻");
    pmenu->add(new subMenu("时事新闻"));
    pmenu->add(new subMenu("社会新闻"));
    pmenu->display();
    pmenu = new compositeMenu("国内新闻");
    pmenu->add(new subMenu("国际要闻"));
    pmenu->add(new subMenu("环球视野"));
    pmenu->display();
    return 0;
}

5.定义

组合模式:
组合多个对象形成树形结构以表示具有”整体-部分”的关系的层次结构.组合模式对单个对象和组合对象的使用具有一致性,组合模式又称为”整体-部分”模式,它是一种对象结构型模式.

6.结构

(1)Component(抽象构件):它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中包含所有子类共有行为的声明和实现.在抽象构件中定义了访问及管理它的子构件的方法,例如增加子构件,删除子构件,获取子构件
(2)Leaf(叶子构件):它在组合模式结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为.对于那些访问及管理子构件的方法,可以通过捕获异常等方式进行处理
(3)Composite(容器构件):它在组合模式中表示容器节点对象,同期节点包含节点,其子节点可以是叶子节点,也可以是同期节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务中可以递归调用其子节点的业务方法.

7.适用场景

(1)在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致性地对待他们.
(2)在一个使用面向对象语言开发的系统中需要处理一个树形结构
(3)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值