add Composite Pattern
parent
deca28dddb
commit
594054237d
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
|
@ -0,0 +1,116 @@
|
||||||
|
#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 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__
|
|
@ -0,0 +1,48 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include "CompositePattern.h"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
Component *head, *sichuanBranch, *cdBranch, *myBranch, *office1, *office2, *office3,
|
||||||
|
*office4, *office5, *office6, *office7, *office8;
|
||||||
|
|
||||||
|
head = new SubComponent("总部");
|
||||||
|
sichuanBranch = new SubComponent("四川分部");
|
||||||
|
office1 = new AdminOffice("行政办公室");
|
||||||
|
office2 = new DeanOffice("教务办公室");
|
||||||
|
|
||||||
|
|
||||||
|
cdBranch = new SubComponent("成都分部");
|
||||||
|
myBranch = new SubComponent("绵阳分部");
|
||||||
|
office3 = new AdminOffice("行政办公室");
|
||||||
|
office4 = new DeanOffice("教务办公室");
|
||||||
|
|
||||||
|
|
||||||
|
office5 = new AdminOffice("行政办公室");
|
||||||
|
office6 = new DeanOffice("教务办公室");
|
||||||
|
|
||||||
|
|
||||||
|
office7 = new AdminOffice("行政办公室");
|
||||||
|
office8 = new DeanOffice("教务办公室");
|
||||||
|
|
||||||
|
cdBranch->add(office5);
|
||||||
|
cdBranch->add(office6);
|
||||||
|
|
||||||
|
myBranch->add(office7);
|
||||||
|
myBranch->add(office8);
|
||||||
|
|
||||||
|
sichuanBranch->add(office3);
|
||||||
|
sichuanBranch->add(office4);
|
||||||
|
sichuanBranch->add(cdBranch);
|
||||||
|
sichuanBranch->add(myBranch);
|
||||||
|
|
||||||
|
head->add(office1);
|
||||||
|
head->add(office2);
|
||||||
|
head->add(sichuanBranch);
|
||||||
|
|
||||||
|
|
||||||
|
head->operation();
|
||||||
|
|
||||||
|
system("pause");
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue