117 lines
2.1 KiB
C++
117 lines
2.1 KiB
C++
#ifndef __COMPOSITE_PATTERN_H__
|
|
#define __COMPOSITE_PATTERN_H__
|
|
|
|
#include <iostream>
|
|
#include <string.h>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
// 抽象构件
|
|
class Component
|
|
{
|
|
public:
|
|
Component(){}
|
|
Component(string iName){
|
|
this->name = iName;
|
|
}
|
|
virtual ~Component(){}
|
|
// 增加一个部门或办公室
|
|
virtual void add(Component*) = 0;
|
|
// 撤销一个部门或办公室
|
|
virtual void remove(Component*) = 0;
|
|
//
|
|
virtual Component* getChild(int) = 0;
|
|
// 各部门操作
|
|
virtual void operation() = 0;
|
|
string getName(){
|
|
return name;
|
|
}
|
|
private:
|
|
string name;
|
|
};
|
|
|
|
// 叶子构件:办公室
|
|
class Office :public Component
|
|
{
|
|
public:
|
|
Office(string iName){
|
|
this->name = iName;
|
|
}
|
|
Office(){}
|
|
void add(Component* c){
|
|
printf("not support!\n");
|
|
}
|
|
void remove(Component* c){
|
|
printf("not support!\n");
|
|
}
|
|
Component* getChild(int i){
|
|
printf("not support!\n");
|
|
return NULL;
|
|
}
|
|
private:
|
|
string name;
|
|
};
|
|
|
|
// 叶子构件:行政办公室
|
|
class AdminOffice :public Office
|
|
{
|
|
public:
|
|
AdminOffice(string iName){
|
|
this->name = iName;
|
|
}
|
|
void operation(){
|
|
printf("-----Administration Office:%s\n", name.c_str());
|
|
}
|
|
private:
|
|
string name;
|
|
};
|
|
|
|
// 叶子构件:教务办公室
|
|
class DeanOffice :public Office
|
|
{
|
|
public:
|
|
DeanOffice(string iName){
|
|
this->name = iName;
|
|
}
|
|
void operation(){
|
|
printf("-----Dean Office:%s\n", name.c_str());
|
|
}
|
|
private:
|
|
string name;
|
|
};
|
|
|
|
// 容器构件SubComponent
|
|
class SubComponent :public Component
|
|
{
|
|
public:
|
|
SubComponent(string iName){
|
|
this->name = iName;
|
|
}
|
|
void add(Component *c){
|
|
componentList.push_back(c);
|
|
}
|
|
void remove(Component *c){
|
|
for (int i = 0; i < componentList.size(); i++){
|
|
if (componentList[i]->getName() == c->getName()){
|
|
componentList.erase(componentList.begin() + i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
Component* getChild(int i){
|
|
return (Component*)componentList[i];
|
|
}
|
|
void operation(){
|
|
printf("%s\n", this->name.c_str());
|
|
for (int i = 0; i < componentList.size(); i++){
|
|
((Component*)componentList[i])->operation();
|
|
}
|
|
}
|
|
private:
|
|
string name;
|
|
|
|
// 构件列表
|
|
vector<Component*>componentList;
|
|
};
|
|
|
|
#endif //__COMPOSITE_PATTERN_H__
|