首先做一下声明,这个代码参考了其他博客(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)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型.