组合模式及C++实现
组合模式
组合模式,是为了解决整体和部分的一致对待的问题而产生的,要求这个整体与部分有一致的操作或行为。部分和整体都继承与一个公共的抽象类,这样,外部使用它们时是一致的,不用管是整体还是部分,使用一个方法即可遍历整体中的所有的部分。就像一个树形结构一样。
如下面的类图,client的只需要使用Component即可,无须关心到底是Leaf还是Composite。
这里有两种情况,add函数对于Leaf来说是没有必要的,所以一种办法就是在Leaf的add实现中什么都不写。
还一种办法就是将add方法挪到Composite中,让外部使用Composite和Component。但这样的缺点就是暴露了Composite,客户端必须知道Composite才能完成操作,好处Leaf不用产生多余的方法了。


常用场景
常用于组织结构,产品结构之类的整体和部分的结构。例如图形由很多直线构成,直线由点构成,这就是整体和部分的关系。如果采用组合模式,只需要使用一个draw方法即可按遍历的方式画出所有的点,最终呈现出来的就是图形。
优点
1.隐藏了整体和部分,让外部依赖于抽象,简化了代码。
缺点
1.要求必须有一致的行为。
2.处于同一个Composite的Leaf与Leaf之间难以传递数据。
C++实现
#ifndef _COMPONENT_H_
#define _COMPONENT_H_ #include <vector>
#include <stdio.h> using namespace std; class Component
{
public:
Component(){};
virtual ~Component(){}; virtual void operation() = ;
}; class Leaf: public Component
{
public:
Leaf(){};
~Leaf(){}; void operation();
}; class Composite: public Component
{
public:
Composite(){};
~Composite(){}; void add(Component*);
void operation(); private:
vector<Component*> m_leafs;
}; #endif
Component.h
#include "Component.h" void Leaf::operation()
{
fprintf(stderr, "----operation leaf\n");
} void Composite::add(Component* c)
{
m_leafs.push_back(c);
} void Composite::operation()
{
fprintf(stderr, "operation Composite\n");
vector<Component*>::iterator comIter = m_leafs.begin(); for (; comIter != m_leafs.end(); comIter++)
{
fprintf(stderr, "----");
(*comIter)->operation();
}
}
Component.cpp
#include "Component.h" int main()
{
Component* leaf1 = new Leaf();
Component* leaf2 = new Leaf(); Composite* composite1 = new Composite();
composite1->add(leaf1);
composite1->add(leaf2); Composite* composite2 = new Composite();
composite2->add(composite1); composite2->operation();
return ;
}
client.cpp
g++ -o client client.cpp Component.cpp
运行结果

组合模式及C++实现的更多相关文章
- ComponentPattern (组合模式)
import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...
- 设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)
上一篇博客中我们从从电影院中认识了"迭代器模式"(Iterator Pattern),今天我们就从文件系统中来认识一下“组合模式”(Composite Pattern).说到组合模 ...
- 设计模式(十)组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- 设计模式--组合模式Composite(结构型)
一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- c#设计模式-组合模式
在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...
- C#设计模式系列:组合模式(Composite)
1.组合模式简介 1.1>.定义 组合模式主要用来处理一类具有“容器特征”的对象——即它们在充当对象的同时,又可以作为容器包含其他多个对象. 1.2>.使用频率 中高 2.组合模式结构图 ...
- php实现设计模式之 组合模式
<?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Co ...
- 轻松掌握:JavaScript组合模式
组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...
- java设计模式之组合模式
组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...
随机推荐
- EXCEL VBA入门篇之代码应用基础
- 整站HTTPS后的跨域请求 CORS是否还有效?
| 导语 手Q马上就要全量https了,很多业务都有跨域ajax请求的需求,原来使用的CORS头在HTTPS环境中还继续能用吗?我搜遍了谷歌.百度,都没看到有明确的答案,那么就自己来尝试一下吧. 关 ...
- STM32 USB CAN 学习笔记 - 共享RAM的用法
USB 时钟可以一直使能. 如果CAN时钟没有使能,RAM 能被软件读写.(CANBus 不能发送和接受Message) 如果CAN时钟使能,RAM不能软件被写. CANBus Core 控制此RAM ...
- HU 参考错误修正:/SCWM/RCORR_HUREF
HU 参考错误修正:report: /SCWM/RCORR_HUREF HU 参考的ODO/ID的凭证号及行项目号不正确的修正程序.
- Android系列--DOM、SAX、Pull解析XML
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
- java.lang.OutOfMemoryError: PermGen space PermGen space & java.lang.OutOfMemoryError: Java heap space Heap siz
java.lang.OutOfMemoryError: PermGen space PermGen space 由-XX:PermSize -XX:MaxPermSize 引起 java.lang. ...
- windbg----as、$u0(固定别名、自定义别名)
固定别名($u0~$u9) 有10个固定别名.他们是$u0, $u1, ..., $u9.他们的等价字符串可以是不包含ENTER键的任意字符串.使用r (Registers)命令为固定别明指定等价字符 ...
- [开发笔记]-MarkDown语法
马克飞象MarkDown在线编辑器 http://maxiang.info/?basic 1. H1--H6 相应数量的# 2. 底线形式 = H1(最高阶标题)和- H2(第二阶标题) 3. 段落和 ...
- 网站用域名能访问,用域名IP不能访问的原因分析
原因分析:一般虚拟主机是不能直接输入IP进行访问的 因为一个IP下有很多网站 ,只能用域名进行访问.如果想IP也能访问,必须网站有独立的IP地址,不是共享IP.如果是IIS的话,要把主机头对应的域名去 ...
- linux ss 网络状态工具
ss是Socket Statistics的缩写 查看网络状态,经常用的命令: watch ss -lnt ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP soc ...