组合模式
2015-01-26 10:08 itwolf 阅读(238) 评论(0) 编辑 收藏 举报一、简介
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行还是有点错误,暂时没找出来,所以删除函数还不能用。