意图:
将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性
适用性:
1表示对象的部分-整体层次结构
2希望用户忽略组合对象与单个对象的不同
效果:
1包含了基本对象和组合对象的类层次结构
2简化客户代码
3使得更容易增加新类型的组件
4 设计更加一般化
实现:
1显式的父部件引用
2共享组件
3最大化Component接口
4声明管理子部件的操作
示例代码如下:
Composite.h
- #include <iostream>
- using namespace std;
- class Composite;
- class Component
- {
- public:
- virtual Composite* GetComposite(){return 0;}
- };
- class Composite:public Component
- {
- public:
- void Add(Component*){cout<<"A Component should be added"<<endl;}
- virtual Composite* GetComposite(){return this;}
- };
- class Leaf:public Component
- {
- public:
- void Add(Component*){cout<<"A leaf should be added"<<endl;}
- };
main.cpp
- #include <iostream>
- #include "Composite.h"
- int main()
- {
- Composite* aComposite = new Composite;
- Leaf* aLeaf = new Leaf;
- Component* aComponent;
- aComponent = aComposite;
- Composite* test;
- if (test = aComponent->GetComposite())
- {
- test->Add(new Leaf);
- }
- aComponent = aLeaf;
- if (test = aComponent->GetComposite())
- {
- test->Add(new Leaf);
- }
- }
- #include <iostream>
- using namespace std;
- class Composite;
- class Component
- {
- public:
- virtual Composite* GetComposite(){return 0;}
- };
- class Composite:public Component
- {
- public:
- void Add(Component*){cout<<"A Component should be added"<<endl;}
- virtual Composite* GetComposite(){return this;}
- };
- class Leaf:public Component
- {
- public:
- void Add(Component*){cout<<"A leaf should be added"<<endl;}
- };
- #include <iostream>
- #include "Composite.h"
- int main()
- {
- Composite* aComposite = new Composite;
- Leaf* aLeaf = new Leaf;
- Component* aComponent;
- aComponent = aComposite;
- Composite* test;
- if (test = aComponent->GetComposite())
- {
- test->Add(new Leaf);
- }
- aComponent = aLeaf;
- if (test = aComponent->GetComposite())
- {
- test->Add(new Leaf);
- }
- }