一、简介
1、组合模式将对象组合成树形结构以表示‘部分和整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
2、模式中的几个重要的类
Component:组合中的对象声明接口,在适当情况下,实现所有类共有接口的行为。
Leaf:叶节点对象,叶节点没有子节点。由于叶节点不能增加分支和树叶,所以叶节点的Add和Remove没有实际意义。
Composite:实现Componet的相关操作,比如Add和Remove操作。
3、UML
4、所属类别:结构型
二、C++代码
1 // 组合模式.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 #include<string>
7 #include<vector>
8 using namespace std;
9
10 class Component
11 {
12 public:
13 Component(){}
14 virtual ~Component(){}
15 virtual void add(Component *)=0;
16 virtual void remove(Component *)=0;
17 virtual void display(int jibie)=0;//为了看清楚树形关系而设置的显示函数
18 };
19 class Leaf:public Component
20 {
21 private:
22 string name;
23 public:
24 Leaf(string n)
25 {
26 name=n;
27 }
28 ~Leaf(){}
29 virtual void add(Component* a)
30 {
31 cout<<"最底层不能再添加部门"<<endl;
32 }
33 virtual void remove(Component* a)
34 {
35 cout<<"最底层没有可以删除的部门"<<endl;
36 }
37 virtual void display(int jibie)
38 {
39 for(int i=0;i<jibie;i++)
40 {
41 cout<<'-';
42 }
43 cout<<name<<endl;
44 }
45 };
46 class Composite:public Component
47 {
48 private:
49 vector<Component*> com;
50 string name;
51 public:
52 Composite(string n)
53 {
54 name=n;
55 }
56 virtual ~Composite(){}
57 virtual void add(Component* a)
58 {
59 com.push_back(a);
60 }
61 virtual void remove(Component*a)
62 {
63 //com.erase(a);
64 }
65 virtual void display(int num)
66 {
67 for(int i=0;i<num;i++)
68 {
69 cout<<'-';
70 }
71 cout<<name<<endl;
72 num=num+2;
73 vector<Component*>::iterator it;
74 for(it=com.begin();it!=com.end();it++)
75 {
76 (*it)->display(num);
77 }
78 }
79 };
80
81 int _tmain(int argc, _TCHAR* argv[])
82 {
83 Component *root=new Composite("河海大学");
84 Component *changzhouxiaoqu=new Composite("河海大学常州校区");
85 Component *wulianwang=new Composite("河海大学常州校区物联网工程学院");
86 Component *jidiangongcheng=new Composite("河海大学常州校区机电工程学院");
87 root->add(changzhouxiaoqu);
88 changzhouxiaoqu->add(wulianwang);
89 changzhouxiaoqu->add(jidiangongcheng);
90 root->display(1);
91 return 0;
92 }
注意:程序中63行还是有点错误,暂时没找出来,所以删除函数还不能用。