设计模式——组合模式(C++实现)

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。是一种结构型模式设计模式——组合模式(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]$ ./composite
139 -root
140 --Leaf A
141 --Leaf B
142 --Composite X
143 ---Leaf XA
144 ---Leaf XB
145 ---Composite XY
146 ----Leaf XYA
147 ----Leaf XYB
148 --leaf D
149 erase Succ: leaf D
150 -root
151 --Leaf A
152 --Leaf B
153 --leaf D

原文链接: https://www.cnblogs.com/070412-zwc/p/6880146.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/254117

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午7:36
下一篇 2023年2月14日 上午7:36

相关推荐