c++ 组合模式(composite)
原文地址:http://www.cnblogs.com/jiese/p/3168844.html
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。
基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。
用户不用关心到底是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合二写一些选择判断语句了。
组合模式让客户可以一致地使用组合结构和单个对象。
抽象基类:
1)Component:为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件.
接口函数:
1)Component::Operatation:定义了各个组件共有的行为接口,由各个组件的具体实现.
2)Component::Add添加一个子组件
3)Component::Remove::删除一个子组件.
4)Component::GetChild:获得子组件的指针.
说明:
Component模式是为解决组件之间的递归组合提供了解决的办法,它主要分为两个派生类:
1)、Leaf是叶子结点,也就是不含有子组件的结点
2)、Composite是含有子组件的类.
举一个例子来说明这个模式,在UI的设计中,最基本的控件是诸如Button、Edit这样的控件,相当于是这里的Leaf组件,而比较复杂的控件
比如Panel则可也看做是由这些基本的组件组合起来的控件,相当于这里的Composite,它们之间有一些行为含义是相同的,比如在控件上作一个点
击,移动操作等等的,这些都可以定义为抽象基类中的接口虚函数,由各个派生类去实现之,这些都会有的行为就是这里的Operation函数,而添加、删除
等进行组件组合的操作只有非叶子结点才可能有,所以虚拟基类中只是提供接口而且默认的实现是什么都不做。
代码如下:
composite.h
#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_ #include <vector> using namespace std; /*
Component抽象基类,为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),
声明一个接口函数可以访问Component的子组件.
*/
class Component
{
public:
//纯虚函数,只提供接口,没有默认的实现
virtual void Operation()=; // 虚函数,提供接口,有默认的实现就是什么都不做
virtual void Add(Component*);
virtual void Remove(Component*);
virtual Component* GetChild(int index);
virtual ~Component();
protected:
Component();
}; //Leaf是叶子结点,也就是不含有子组件的结点类,所以不用实现Add、Remove、GetChild等方法
class Leaf:public Component
{
public:
//只实现Operation接口
virtual void Operation();
Leaf();
~Leaf();
}; //Composite:含有子组件的类
class Composite:public Component
{
public:
Composite();
~Composite();
//实现所有接口
void Operation();
void Add(Component*);
void Remove(Component*);
Component* GetChild(int index);
private:
//这里采用vector来保存子组件
vector<Component*> m_ComVec;
};
#endif
composite.cpp
#include "Composite.h"
#include <iostream> using namespace std; Component::Component()
{} Component::~Component()
{} void Component::Add(Component* com)
{
cout << "add" << endl;
} void Component::Remove(Component* com)
{
} void Component::Operation()
{
cout << "Component::Operation" << endl;
} Component* Component::GetChild(int index)
{
return NULL;
} Leaf::Leaf()
{} Leaf::~Leaf()
{} void Leaf::Operation()
{
cout<< "Leaf::Operation" <<endl;
} Composite::Composite()
{
} Composite::~Composite()
{} void Composite::Add(Component* com)
{
this->m_ComVec.push_back(com);
} void Composite::Remove(Component* com)
{
//this->m_ComVec.erase(com);
} void Composite::Operation()
{
cout << "Composite::Operation" << endl;
vector<Component*>::iterator iter = this->m_ComVec.begin();
for(;iter!= this->m_ComVec.end();iter++)
{
(*iter)->Operation();
}
} Component* Composite::GetChild(int index)
{
if(index < || index > this->m_ComVec.size())
{
return NULL;
}
return this->m_ComVec[index];
}
main.cpp
#include "composite.h"
#include <iostream> using namespace std; int main()
{
/*
不管是叶子Leaf还是Composite对象pRoot、pCom都实现了Operation接口,所以可以一致对待,直接调用Operation()
体现了“使得用户对单个对象和组合对象的使用具有一致性。”
*/
Composite* pRoot = new Composite(); //组合对象添加叶子节点
pRoot->Add(new Leaf()); Leaf* pLeaf1 = new Leaf();
Leaf* pLeaf2 = new Leaf(); //这里的叶子再添加叶子是没有意义的。
//由于叶子与组合对象继承了相同的接口,所以语法上是对的,实际上什么也没做(继承自基类Component的Add方法)。
//叶子节点只实现了Operation方法,其他Add、Remove、GetChild都继承自基类,没有实际意义。
pLeaf1->Add(pLeaf2);
pLeaf1->Remove(pLeaf2);
//执行叶子Operation操作
pLeaf1->Operation(); //组合对象实现了基类Component的所有接口,所以可以做各种操作(Add、Remove、GetChild、Operation)。
Composite* pCom = new Composite();
//组合对象添加叶子节点
pCom->Add(pLeaf1);
//组合对象添加叶子节点
pCom->Add(pLeaf2);
//执行组合对象Operation操作
pCom->Operation(); //组合对象添加组合对象
pRoot->Add(pCom); //执行组合对象Operation操作
pRoot->Operation(); //Component* cp = pCom->GetChild(0);
//cp->Operation(); //pCom->Remove(pLeaf1); system("pause");
return ;
}
c++ 组合模式(composite)的更多相关文章
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- 浅谈设计模式--组合模式(Composite Pattern)
组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- 设计模式(七)组合模式Composite(结构型)
设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- 【设计模式】组合模式 Composite Pattern
树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...
- 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释
组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...
- 设计模式系列之组合模式(Composite Pattern)——树形结构的处理
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式--组合模式Composite(结构型)
一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...
- C#设计模式——组合模式(Composite Pattern)
一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...
随机推荐
- ngxtop实时监控nginx状态
ngxtop实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top,所以这个软件起名ngxtop.有了ngxtop,你可以实时了解到当前nginx的访问状况,再也不需要tail ...
- 关于15桥梁课程1&2的笔记以及待做事项的梳理
1.指针所占用的空间是固定的 2.void *malloc(sizeof(int)); (这玩意耗时间,老师说通过内存池解决) free(p);free(p); 两次free()报错,正确的做法: ...
- linux rhel7下安装python
1.查看是否已经安装Python Centos7默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用python -V命令查看一下是否安装Pytho ...
- 剑指offer-第六章面试中的各项能力(二叉树的深度)
题目:1:输入一个二叉树,求二叉树的深度.从根节点开始最长的路径. 思路:我们可以考虑用递归,求最长的路径实际上就是求根节点的左右子树中较长的一个然后再加上1. 题目2:输入一颗二叉树的根节点,判断该 ...
- java 执行JavaScript 以及容器化的问题
1. 可选方案 a. jdk 6 开始内置的Rhino 引擎 b. jdk8 替换的nashorn (性能高,对于ECMA 支持更好) c. java 版的nodejs vertx.i ...
- 17.Selenium+Python日期控件小案例
1.web上的控件种类十分多,但是大致分为2种,一种为类型是input的且可以输入,第二种为类型是input的且属性为readonly,文本框不可编辑 2.第一种类型为可以输入的,直接send_key ...
- Sql 中Collate用法
今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...
- delphi2010多线程编程教程
多线程编程(1) - 先入门再说. 多线程应该是编程工作者的基础技能, 但这个基础对我来讲的确有点难(起码昨天以前是这样). 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解 ...
- git fatal: remote origin already exists. 报错解决
在研究git的时候,随便输了个 git remote add origin xxx; 然后再真正add 远程仓库的时候,报了git fatal: remote origin already exist ...
- 几种系统下查看FC HBA卡信息的方法
几种系统下查看FC HBA卡信息的方法 目 录 几种系统下查看FC HBA卡信息的方法 FC HBA卡概述 Windows系统下查看FC HBA卡的信息 Linux系统下查看FC HBA卡的信息 U ...