0 引言
0.1 目的
本文档给出设计模式之——Composite模式的简化诠释,并给出其C++实现。
0.2 说明
Project |
Design Pattern Explanation(By K_Eckel) |
Authorization |
Free Distributed but Ownership Reserved |
Date |
|
Test Bed |
MS Visual C++ 6.0 |
0.3 参考
在本文档的写作中,参考了以下的资源,在此列出表示感谢:
u 书籍
[GoF 2000]:GoF,Design Patterns-Elements of Reusable Object-Oriented Software
Addison-Wesley 2000/9.
[Martine 2003]:Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.
0.4 联系作者
Author |
K_Eckel |
State |
Candidate for Master’s Degree School of |
E_mail |
2 Composite模式
2.1 问题
在开发中,我们经常可能要递归构建树状的组合结构,Composite模式则提供了很好的解决方案。
2.2 模式选择
Composite模式的典型结构图为:
图2-1:Composite Pattern结构图
2.3 实现
2.3.1 完整代码示例(code)
Composite模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。
代码片断1:Component.h #ifndef _COMPONENT_H_ class Component virtual ~Component(); public: virtual void Add(const Component& ); virtual void Remove(const Component& ); virtual Component* GetChild(int ); protected: private: }; #endif //~_COMPONENT_H_ |
代码片断2:Component.cpp #include "Component.h" Component::Component() } Component::~Component() } void Component::Add(const Component& com) } Component* Component::GetChild(int index) void Component::Remove(const Component& com) } |
代码片断3:Composite.h #ifndef _COMPOSITE_H_ #include "Component.h" class Composite:public Component ~Composite(); public: void Add(Component* com); void Remove(Component* com); Component* GetChild(int index); protected: private: }; #endif //~_COMPOSITE_H_ |
代码片断4:Composite.cpp #include "Composite.h" #define NULL 0 //define NULL POINTOR Composite::Composite() Composite::~Composite() } void Composite::Operation() void Composite::Add(Component* com) void Composite::Remove(Component* com) Component* Composite::GetChild(int index) |
代码片断5:leaf.h #ifndef _LEAF_H_ #include "Component.h" class Leaf:public Component ~Leaf(); void Operation(); protected: private: };
|
代码片断6:leaf.cpp #include "Leaf.h" Leaf::Leaf() } Leaf::~Leaf() void Leaf::Operation() |
代码片断7:main.cpp #include "Component.h" int main(int argc,char* argv[]) Composite* com = new Composite(); com->Add(l); com->Operation(); Component* ll = com->GetChild(0); ll->Operation(); return 0; |
2.3.2 代码说明
Composite模式在实现中有一个问题就是要提供对于子节点(Leaf)的管理策略,这里使用的是STL 中的vector,可以提供其他的实现方式,如数组、链表、Hash表等。
2.4 讨论
Composite模式通过和Decorator模式有着类似的结构图,但是Composite模式旨在构造类,而Decorator模式重在不生成子类即可给对象添加职责。Decorator模式重在修饰,而Composite模式重在表示。