首页 > 代码库 > 设计模式——组合模式(C++实现)
设计模式——组合模式(C++实现)
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。
组合模式使得用户对单个对象和组合对象的使用具有一致性。
是一种结构型模式
使用场景:
1、用于对象的部分-整体层次结构,如树形菜单、文件夹菜单、部门组织架构图等;
2、对用户隐藏组合对象与单个对象的不同,使得用户统一地使用组合结构中的所有对象。
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 5 using namespace std; 6 7 class STComponent 8 { 9 public: 10 STComponent() 11 { 12 13 } 14 STComponent(string strName): m_strName(strName) 15 { 16 17 } 18 virtual ~STComponent() 19 { 20 21 } 22 23 /* 24 virtual void Add(STComponent* c); 25 virtual void Remove(STComponent* c) ; 26 virtual void Display(int iDepth); 27 */ 28 29 30 virtual void Add(STComponent* c) = 0; 31 virtual void Remove(STComponent* c) = 0; 32 virtual void Display(int iDepth) = 0; 33 34 string m_strName; 35 36 }; 37 38 class STLeaf: public STComponent 39 { 40 public: 41 STLeaf(string strName): STComponent(strName) 42 { 43 44 } 45 46 virtual void Add(STComponent* c) 47 { 48 cout<< "Cann‘t Add to a leaf"<< endl; 49 } 50 virtual void Remove(STComponent* c) 51 { 52 cout<< "Cann‘t Remove from a leaf"<< endl; 53 } 54 virtual void Display(int iDepth) 55 { 56 cout<< string(iDepth, ‘-‘)<< m_strName<< endl; 57 } 58 }; 59 60 class STComposite: public STComponent 61 { 62 public: 63 STComposite(string strName): STComponent(strName) 64 { 65 66 } 67 ~STComposite() 68 { 69 m_vecStComposite.clear(); 70 } 71 72 virtual void Add(STComponent* c) 73 { 74 m_vecStComposite.push_back(c); 75 } 76 77 virtual void Remove(STComponent* c) 78 { 79 for (typeof(m_vecStComposite.begin()) it = m_vecStComposite.begin(); it != m_vecStComposite.end();) 80 { 81 if (*it == c) 82 { 83 it = m_vecStComposite.erase(it); 84 cout<< "erase Succ: "<< (*it)->m_strName<< endl; 85 } 86 else 87 { 88 ++it; 89 } 90 } 91 } 92 93 virtual void Display(int iDepth) 94 { 95 cout<< string(iDepth, ‘-‘)<< m_strName<< endl; 96 for (size_t i = 0; i < m_vecStComposite.size(); ++i) 97 { 98 m_vecStComposite[i]->Display(iDepth+1); 99 }100 }101 102 vector<STComponent*> m_vecStComposite;103 };104 105 int main(int argc, char* argv[])106 {107 //STLeaf* pstLeaf = new STLeaf("leafA");108 //pstLeaf->Add(NULL);109 //pstLeaf->Remove(NULL);110 //pstLeaf->Display(10);111 //delete pstLeaf;112 113 STComposite* root = new STComposite("root");114 root->Add(new STLeaf("Leaf A"));115 root->Add(new STLeaf("Leaf B"));116 117 STComposite* comp = new STComposite("Composite X");118 comp->Add(new STLeaf("Leaf XA"));119 comp->Add(new STLeaf("Leaf XB"));120 root->Add(comp);121 122 STComposite* comp2 = new STComposite("Composite XY");123 comp2->Add(new STLeaf("Leaf XYA"));124 comp2->Add(new STLeaf("Leaf XYB"));125 comp->Add(comp2);126 127 STLeaf* pstLeaf = new STLeaf("leaf D");128 root->Add(pstLeaf);129 root->Display(1);130 131 // root->Remove(pstLeaf);132 root->Remove(comp);133 root->Display(1);134 135 return 0;136 }137 /////////////////////////////138 [root@ ~/learn_code/design_pattern/16_composite]$ ./composite139 -root140 --Leaf A141 --Leaf B142 --Composite X143 ---Leaf XA144 ---Leaf XB145 ---Composite XY146 ----Leaf XYA147 ----Leaf XYB148 --leaf D149 erase Succ: leaf D150 -root151 --Leaf A152 --Leaf B153 --leaf D
设计模式——组合模式(C++实现)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。