Henkk

导航

设计模式学习之----组合模式

  单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示"部分--整体"

  例如:文件和目录的显示,单个对象是文件,组合对象是目录,一致性是显示。

 1 #include <iostream>
 2 #include <string>
 3 #include <list>
 4 
 5 using namespace std;
 6 class IFile
 7 {
 8 public:
 9     virtual void display() = 0;
10     virtual int add(IFile *iFile) = 0;
11     virtual int remove(IFile *iFile) = 0;
12     virtual list<IFile*>* getChild() = 0;
13 };
14 
15 //文件节点
16 class File : public IFile
17 {
18 public:
19     File(string name)
20     {
21         m_name = name;
22     }
23     virtual void display()
24     {
25         cout << m_name << endl;
26     }
27 
28     virtual int add(IFile *iFile)
29     {
30         return -1;
31     }
32     virtual int remove(IFile *iFile)
33     {
34         return -1;
35     }
36     virtual list<IFile*>* getChild()
37     {
38         return NULL;
39     }
40 
41 private:
42     string m_name;
43 };
44 
45 //目录节点
46 class Dir : public IFile
47 {
48 public:
49     Dir(string name)
50     {
51         m_name = name;
52         m_list = new list<IFile *>;
53     }
54 
55     virtual void display()
56     {
57         cout << m_name << endl;
58     }
59 
60     virtual int add(IFile *iFile)
61     {
62         m_list->push_back(iFile);
63         return 1;
64     }
65 
66     virtual int remove(IFile *iFile)
67     {
68         m_list->remove(iFile);
69         return 1;
70     }
71 
72     virtual list<IFile*>* getChild()
73     {
74         return m_list;
75     }
76 
77 private:
78     string m_name;
79     list<IFile*> *m_list;
80 };
81 
82 int main()
83 {
84     Dir *root = new Dir("C.....");
85     root->display();
86     Dir *dir1   = new Dir("1111dir1");
87     File *file1 = new File("file1");
88     root->add(dir1);
89     root->add(file1);
90 
91     using iter = list<IFile*>::iterator;
92     list<IFile*> *list = root->getChild();
93     for (iter it = list->begin(); it != list->end(); it++)
94     {
95         (*it)->display();
96     }
97 
98     return system("pause");
99 }

 

posted on 2020-05-22 15:12  Henkk  阅读(147)  评论(0编辑  收藏  举报