常见设计模式的解析和实现(C++)之八-Composite模式
来源:互联网 发布:斑马gk888t mac驱动 编辑:程序博客网 时间:2024/06/15 08:06
作用:
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
UML结构图:
![](http://www.yesky.com/20020725/fangz20725_5.gif)
抽象基类:
1)Component:为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件.
接口函数:
1)Component::Operatation:定义了各个组件共有的行为接口,由各个组件的具体实现.
2)Component::Add添加一个子组件
3)Component::Remove::删除一个子组件.
4)Component::GetChild:获得子组件的指针.
解析:
Component模式是为解决组件之间的递归组合提供了解决的办法,它主要分为两个派生类,其中的Leaf是叶子结点,也就是不含有子组件的结点,而Composite是含有子组件的类.举一个例子来说明这个模式,在UI的设计中,最基本的控件是诸如Button,Edit这样的控件,相当于是这里的Leaf组件,而比较复杂的控件比如List则可也看做是由这些基本的组件组合起来的控件,相当于这里的Composite,它们之间有一些行为含义是相同的,比如在控件上作一个点击,移动操作等等的,这些都可以定义为抽象基类中的接口虚函数,由各个派生类去实现之,这些都会有的行为就是这里的Operation函数,而添加,删除等进行组件组合的操作只有非叶子结点才可能有,所以虚拟基类中只是提供接口而且默认的实现是什么都不做.
实现:
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
UML结构图:
![](http://www.yesky.com/20020725/fangz20725_5.gif)
抽象基类:
1)Component:为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件.
接口函数:
1)Component::Operatation:定义了各个组件共有的行为接口,由各个组件的具体实现.
2)Component::Add添加一个子组件
3)Component::Remove::删除一个子组件.
4)Component::GetChild:获得子组件的指针.
解析:
Component模式是为解决组件之间的递归组合提供了解决的办法,它主要分为两个派生类,其中的Leaf是叶子结点,也就是不含有子组件的结点,而Composite是含有子组件的类.举一个例子来说明这个模式,在UI的设计中,最基本的控件是诸如Button,Edit这样的控件,相当于是这里的Leaf组件,而比较复杂的控件比如List则可也看做是由这些基本的组件组合起来的控件,相当于这里的Composite,它们之间有一些行为含义是相同的,比如在控件上作一个点击,移动操作等等的,这些都可以定义为抽象基类中的接口虚函数,由各个派生类去实现之,这些都会有的行为就是这里的Operation函数,而添加,删除等进行组件组合的操作只有非叶子结点才可能有,所以虚拟基类中只是提供接口而且默认的实现是什么都不做.
实现:
1)Composite.h
/******************************************************************** created: 2006/07/20 filename: Composite.h author: 李创 http://www.cppblog.com/converse/ purpose: Composite模式的演示代码*********************************************************************/#ifndef COMPOSITE_H#define COMPOSITE_H#include <list>// 组合中的抽象基类class Component{public: Component(){} virtual ~Component(){} // 纯虚函数,只提供接口,没有默认的实现 virtual void Operation() = 0; // 虚函数,提供接口,有默认的实现就是什么都不做 virtual void Add(Component* pChild); virtual void Remove(Component* pChild); virtual Component* GetChild(int nIndex);};// 派生自Component,是其中的叶子组件的基类class Leaf : public Component{public: Leaf(){} virtual ~Leaf(){} virtual void Operation();};// 派生自Component,是其中的含有子件的组件的基类class Composite : public Component{public: Composite(){} virtual ~Composite(); virtual void Operation(); virtual void Add(Component* pChild); virtual void Remove(Component* pChild); virtual Component* GetChild(int nIndex);private: // 采用list容器去保存子组件 std::list<Component*> m_ListOfComponent;};#endif
2)Composite.cpp
/******************************************************************** created: 2006/07/20 filename: Composite.cpp author: 李创 http://www.cppblog.com/converse/ purpose: Composite模式的演示代码*********************************************************************/#include "Composite.h"#include <iostream>#include <algorithm>/*------------------------------------------------------------------- Component成员函数的实现 -------------------------------------------------------------------*/void Component::Add(Component* pChild){}void Component::Remove(Component* pChild){}Component* Component::GetChild(int nIndex){ return NULL;}/*------------------------------------------------------------------- Leaf成员函数的实现-------------------------------------------------------------------*/void Leaf::Operation(){ std::cout << "Operation by leaf\n";}/*------------------------------------------------------------------- Composite成员函数的实现-------------------------------------------------------------------*/Composite::~Composite(){ std::list<Component*>::iterator iter1, iter2, temp; for (iter1 = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end(); iter1 != iter2; ) { temp = iter1; ++iter1; delete (*temp); }}void Composite::Add(Component* pChild){ m_ListOfComponent.push_back(pChild);}void Composite::Remove(Component* pChild){ std::list<Component*>::iterator iter; iter = find(m_ListOfComponent.begin(), m_ListOfComponent.end(), pChild); if (m_ListOfComponent.end() != iter) { m_ListOfComponent.erase(iter); }}Component* Composite::GetChild(int nIndex){ if (nIndex <= 0 || nIndex > m_ListOfComponent.size()) return NULL; std::list<Component*>::iterator iter1, iter2; int i; for (i = 1, iter1 = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end(); iter1 != iter2; ++iter1, ++i) { if (i == nIndex) break; } return *iter1;}void Composite::Operation(){ std::cout << "Operation by Composite\n"; std::list<Component*>::iterator iter1, iter2; for (iter1 = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end(); iter1 != iter2; ++iter1) { (*iter1)->Operation(); }}
3)Main.cpp
/******************************************************************** created: 2006/07/20 filename: Main.cpp author: 李创 http://www.cppblog.com/converse/ purpose: Composite模式的测试代码*********************************************************************/#include "Composite.h"#include <stdlib.h>int main(){ Leaf *pLeaf1 = new Leaf(); Leaf *pLeaf2 = new Leaf(); Composite* pComposite = new Composite; pComposite->Add(pLeaf1); pComposite->Add(pLeaf2); pComposite->Operation(); pComposite->GetChild(2)->Operation(); delete pComposite; system("pause"); return 0;}
- 常见设计模式的解析和实现(C++)之八-Composite模式
- 常见设计模式的解析和实现(C++)之八-Composite模式
- 常见设计模式的解析和实现(C++)之八-Composite模式
- 常见设计模式的解析和实现(C++)之八-Composite模式
- 设计模式解析和实现(C++)之八-Composite模式
- 常见设计模式的解析和实现(C++)---Adapt模式
- 常见设计模式的解析和实现(C++)之二十-Visitor模式
- 常见设计模式的解析和实现(C++)之十九-Memento模式
- 常见设计模式的解析和实现(C++)之十八-Iterator模式
- 常见设计模式的解析和实现(C++)之十七-State模式
- 常见设计模式的解析和实现(C++)之十六-Strategy模式
- 常见设计模式的解析和实现(C++)之十五-Observer模式
- 常见设计模式的解析和实现(C++)之十四-Command模式
- 常见设计模式的解析和实现(C++)之十三-FlyWeight模式
- 常见设计模式的解析和实现(C++)之十二-ChainOfResponsibility模式
- 常见设计模式的解析和实现(C++)之十一-TemplateMethod模式
- 常见设计模式的解析和实现(C++)之十-Proxy模式
- 常见设计模式的解析和实现(C++)之九-Decorator模式
- 集合使用注意事项
- Object转换为String[]数组,或者其他类型的数组
- 梁继璋给儿子的一封信
- eclipse中javascript显示为乱码的解决办法
- U_BOOT_CMD命令的实现
- 常见设计模式的解析和实现(C++)之八-Composite模式
- ssh xml方式
- 如何实现W7100A中的UART(三)
- 使用PHP和jQuery打造文件上传进度条
- .Net Framework4 与.Net Framework4.0 client profile区别问题
- Oracle创建到sqlserver的DBlink
- OpenGL: 文本显示
- 使用PHP、jQuery和CSS制作gravatar头像登录窗
- 2012软件项目开发过程规范要案