设计模式--组合模式C++实现
组合模式C++实现
1定义
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
2类图
角色分析
Component抽象构建角色
定义参加组合独享的共同方法和属性,可以定义一些默认的行为或者属性
Leaf叶子结构,旗下没有分支,是最小的遍历单位
Composite树枝结构,作用是组合树枝节点和叶子结点形成的树形结构
3实现
class Component
{
protected:
Component();
public:
virtual ~Component() = 0;
//所有结点都有的共同信息
virtual void doSomething() = 0;
};
//树枝结构
class Composite :public Component
{
private:
list<Component> _comList = new list<Component>();
public:
//增加一个叶子构建或者树枝构建
void add(Component &Com)
{
_comList.push_back(Com);
}
void remove(Component &com)
{
_comList.remove(com);
}
list<Component> getChildren()
{
return _comList;
}
};
//树叶结构
class Leaf:public Component
{
public:
//覆盖父类方法
void doSomething()
{}
};
void display(Composite root)
{
//遍历root的孩子,
如果是叶子:打印
else
递归
}
void Test
{
Composite *root = new Composite();
root->doSomething();
composite *branch = new Composite();
Leaf* leaf = new Leaf();
root->add(branch);
root->add(leaf);
}
4应用
①优点
高层模块调用简单,所有结点都是Component ,局部和整体对调用者来说没有任何区别,高层不必关心自己处理的是单个对象还是整个组合结构
结点自由增加,使用组合模式,如果想增加树枝节点,树叶结点都很容易,只要找到父节点就行,符合开闭原则
②缺点
树枝和树叶结点使用时的定义,直接使用的是实现类。违背依赖倒置原则
③使用场景
维护和展示一部分-整体关系的场景:eg树形菜单,文件和文件夹管理
从一个整体中能够独立出部分模块和功能的场景
④注意事项
只要是树形结构,就考虑组合模式,只要体现这你部分关系,就使用组合模式
5扩展
①项目中常用的一种:由文件中的职员表项简历数据结构。能够通过for和递归直接创建结构
②组合模式:
a安全模式-如上
b透明模式-把用来组合使用的方法放在抽象类中,eg:add,remove,getChild
所以:叶子节点和树枝节点都继承得到以上方法,只是叶子节点内部空实现,什么也不做。。这样做的好处是,客户端遍历直接多态化,不用类型转换。
6提升
对于这个组合模式,可能存在随机访问的问题,那么 增加一个父指针,实现目标即可
设计模式--组合模式C++实现的更多相关文章
- 16. 星际争霸之php设计模式--组合模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
- 【设计模式】Java设计模式 - 组合模式
Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- c#设计模式-组合模式
在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...
- [Head First设计模式]生活中学设计模式——组合模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 组合模式
用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构
- javascript设计模式-组合模式
组合模式所要解决的问题: 可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象. 客户端代码必须区别对象简单对象和 ...
- 设计模式组合模式(Composite)精华
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建 ...
- 设计模式 -- 组合模式 (Composite Pattern)
定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: ...
- javascript设计模式——组合模式
前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...
随机推荐
- 网页中Cache各字段含义
Pragma 当该字段值为"no-cache"的时候(事实上现在RFC中也仅标明该可选值),会知会客户端不要对该资源读缓存,即每次都得向服务器发一次请求才行. Expires 有了 ...
- nginx 413文件上报太大
在nginx使用过程中,上传文件的过程中,通常需要设置nginx报文大小限制.避免出现413 Request Entity Too Large. 于是奇葩的问题被我们遇到了,详细配置请参考下面.我们的 ...
- 『NiFi 自定义 Processor 无法获取到 Logger』问题解决
一.概述 自定义的 Processor 继承了 AbstractProcessor,而 AbstractProcessor 继承了 AbstractSessionFactoryProcessor ,g ...
- configparser模块来生成和修改配置文件
1. 安装configparser模块 pip3 install configparser ##python2.7模块名为ConfigParser 2. 创建配置文件 import configpar ...
- Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法
Android-服务中监听电源键和Home键的广播 http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...
- datanode扩容步骤
新扩容机器规划: hostname ip 进程 slave3 10.183.225.167 datanode,nodemange 1. 修改/etc/hosts 增加新扩容机器的hostname 10 ...
- 利用python获取nginx服务的ip以及流量统计信息
#!/usr/bin/python #coding=utf8 log_file = "/usr/local/nginx/logs/access.log" with open(log ...
- 快用Visual Studio(二)- 界面,功能区与命令面板
Layout Editing Explorer Saving Searching Command Palette File Navigation File and Folder Based Files ...
- mysql系列之多实例介绍
介绍: mysql多实例,简单理解就是在一台服务器上,mysql服务开启多个不同的端口(如3306.3307),运行多个服务进程.这些 mysql 服务进程通过不同的 socket来监听不同的数据端口 ...
- python-内置函数及捕获异常
eval:把字符串转换成有效表达式 repr:把有效表达式转换成字符串 round(...) round(number[, ndigits]) -> number Round a num ...