0 引言

0.1 目的

       本文档给出设计模式之——Composite模式的简化诠释,并给出其C++实现

0.2 说明

Project

Design Pattern ExplanationBy K_Eckel

Authorization

Free Distributed but Ownership Reserved

Date

2005-04-05Cherry blossom is Beautiful

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 Computer Wuhan University

E_mail

frwei@whu.edu.cn  

2 Composite模式

2.1 问题

       在开发中,我们经常可能要递归构建树状的组合结构,Composite模式则提供了很好的解决方案。

2.2 模式选择

Composite模式的典型结构图为:


2-1Composite Pattern结构图

2.3 实现

2.3.1 完整代码示例(code

       Composite模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。

代码片断1Component.h
//Component.h

#ifndef _COMPONENT_H_
#define _COMPONENT_H_

class Component
{
public:
 Component();

 virtual ~Component();

public:
 virtual void Operation() = 0;

 virtual void Add(const Component& );

 virtual void Remove(const Component& );

 virtual Component* GetChild(int );

protected:

private:

};

#endif //~_COMPONENT_H_

代码片断2Component.cpp
//Component.cpp

#include "Component.h"

Component::Component()
{

}

Component::~Component()
{

}

void Component::Add(const Component& com)
{

}

Component* Component::GetChild(int index)
{
 return 0;
}

void Component::Remove(const Component& com)
{

}

  代码片断3Composite.h
//Composite.h

#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_

#include "Component.h"
#include <vector>
using namespace std;

class Composite:public Component
{
public:
 Composite();

 ~Composite();

public:
 void Operation();

 void Add(Component* com);

 void Remove(Component* com);

 Component* GetChild(int index);

protected:

private:
 vector<Component*> comVec;

};

#endif //~_COMPOSITE_H_

代码片断4Composite.cpp
//Composite.cpp

#include "Composite.h"
#include "Component.h"

#define NULL 0   //define NULL POINTOR

Composite::Composite()
{
 //vector<Component*>::iterator itend = comVec.begin();
}

Composite::~Composite()
{

}

void Composite::Operation()
{
 vector<Component*>::iterator comIter = comVec.begin();
 
 for (;comIter != comVec.end();comIter++)
 {
  (*comIter)->Operation();
 }
}

void Composite::Add(Component* com)
{
 comVec.push_back(com);
}

void Composite::Remove(Component* com)
{
 comVec.erase(&com);
}

Component* Composite::GetChild(int index)
{
 return comVec[index];
}

代码片断5leaf.h
//Leaf.h

#ifndef _LEAF_H_
#define _LEAF_H_

#include "Component.h"

class Leaf:public Component
{
public:
 Leaf();

 ~Leaf();

 void Operation();

protected:

private:

};


#endif //~_LEAF_H_

代码片断6leaf.cpp
//Leaf.cpp

#include "Leaf.h"
#include <iostream>
using namespace std;

Leaf::Leaf()
{

}

Leaf::~Leaf()
{
 
}

void Leaf::Operation()
{
 cout<<"Leaf operation....."<<endl;
}

代码片断7main.cpp
//main.cpp

#include "Component.h"
#include "Composite.h"
#include "Leaf.h"
#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
 Leaf* l = new Leaf();
 l->Operation();

 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模式重在表示。

Posted on 2005-07-08 21:03  k_eckel's mindview  阅读(664)  评论(0编辑  收藏  举报