c++设计模式概述之组合(composite)
代码写的不够规范,目的是为了缩短代码篇幅, 实际中请不要这样做
1、概述
这里的组合,是将 部分组合到整体。所以, 用到的对象有: 部分、整体。 这里的例子,生活中可以类比厨房的筷筒: 里面放了筷子,勺子。 筷子 勺子就是部分, 整体就是块筒。再比如,冰箱 和放入冰箱的食材, 冰箱就是整体, 放入冰箱的食材就是部分。
对用户而言,对整体操作而不用关心操作的是具体哪一个对象。这就需要 部分与整体需要拥有对外相同接口。
2、代码示例
下面演示的是水果与果盘的关系。水果准备了 草莓 和 苹果。 这里的水果就是部分,果盘就是整体。
A、对外的接口类:
class melement
{
public:
virtual void eat() = 0;
};
B、苹果类,继承自上面的对外接口类
// apple
class apple : public melement
{
public:
void eat()
{
cout << "\n\n I am eating apple\n\n";
}
};
C、草莓类,继承自上面的对外接口类
// strawberry
class strawberry : public melement
{
public:
void eat()
{
cout << "\n\n I am eating strawberry\n\n";
}
};
D、果盘类,当然,也需要继承上面的对外接口类,果盘,可以添加和减少水果,额外增加了2个接口
// plate to contain fruits
class plate : public melement
{
public:
// add a fruit into the plate
void increase(melement *pele)
{
if (pele)
_list_fruits.push_back(pele);
} // away from plate
void decrease(melement* pele)
{
if (pele)
_list_fruits.remove(pele);
} // show the current fruits
void eat()
{
for each (auto ele in _list_fruits)
{
if (ele)
ele->eat();
}
} private:
list<melement *> _list_fruits;
};
3、调用
这里,向果盘中添加了4个水果,再吃掉一个。
void call_mode_composite()
{
const int count_fruits_4 = 4;
std::unique_ptr<melement> arr_fruits[count_fruits_4];
std::unique_ptr<plate> pplate(new(std::nothrow) plate); if (!pplate )
{
cout << "\n\n created plate failed \n\n";
return;
} // -------------------------------------------------------------------------------
for (int i = 0; i < count_fruits_4; i++)
{
melement *pp = nullptr;
if (i < 2)
arr_fruits[i] = std::unique_ptr < melement>(new(std::nothrow) apple);
else
arr_fruits[i] = std::unique_ptr < melement>(new(std::nothrow) strawberry); pplate->increase(arr_fruits[i].get());
} cout << "before decrease:\n";
pplate->eat(); cout << "\n\n after decreasing, eat:\n";
pplate->decrease(arr_fruits[0].get());
pplate->eat(); }
输出结果:

c++设计模式概述之组合(composite)的更多相关文章
- Ruby设计模式透析之 —— 组合(Composite)
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9153761 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- PHP设计模式概述
PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- java设计模式-----13、组合模式
Composite模式也叫组合模式,是构造型的设计模式之一.通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树. 组合(Composite)模式的其它翻译名称也很多,比如合成模式.树 ...
- java23种设计模式——八、组合模式
目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
随机推荐
- UOJ 422 - 【集训队作业2018】小Z的礼物(Min-Max 容斥+轮廓线 dp)
题面传送门 本来说要找道轮廓线 \(dp\) 的题目刷刷来着的?然后就找到了这道题. 然鹅这个题给我最大的启发反而不在轮廓线 \(dp\),而在于让我新学会了一个玩意儿叫做 Min-Max 容斥. M ...
- Tarjan 的一些板子
圆方树(会在两圆点间建方点): void tarjan(int u) { low[u] = dfn[u] = ++dfc, stk[++top] = u, num++; for (int v : G[ ...
- 生物信息Linux用户创建与配额设置
创建一个新用户,并配置使用. create_usr.sh: #/usr/bin/bash user=$1 password="123" useradd ${user} -g met ...
- 除了GO基因本体论,还有PO、TO、CO等各种Ontology?
目录 PO/TO CO 后记 我们最常用最熟悉的功能数据库之一:GO(gene onotology),基因本体论.其实是一套标准词汇术语,目的是从不同角度来描述某个基因的特点和功能,三大本体如生物学进 ...
- Zabbix源码安装,使用service命令管理zabbix进程
1. 前期环境: Zabbix源代码解压包:/root/zabbix-3.0.27 Zabbix安装路径:/usr/local/zabbix-3.0.27 2. 复制启动脚本到 ...
- (数据科学学习手札132)Python+Fabric实现远程服务器连接
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 日常工作中经常需要通过SSH连接到多台远程 ...
- 网易云信 集成UI库登录dologin没有回调
感谢github上的两位大佬指出问题的解决方法. 解决方法: 在进行ui初始化要在主进程中进行,初始化前进行主进程判断. 若还收不到回调,可尝试将uikit中的base包去掉而在build.gradl ...
- Shell 指定行处理head、tail、sed
目录 Shell 指定行处理 head.tail.sed head 前几行 tail sed 删除.替换.新增.选取 案例 删除行 插入行 查看某行 替换某行 部分数据的查找并替换 读写操作 Shel ...
- Java 数据类型转化
目录 Java类型转化 基本数据类型自动类型转换 自动类型提升 强制类型转换 - 自动类型提升的逆运算 int与long int类型与String类型 int类型转换成String类型 方法1:+ 拼 ...
- Spring中的InitializingBean与DisposableBean
InitializingBean顾名思义,应该是初始化Bean相关的接口. 先看一下该接口都定义了哪些方法: public interface InitializingBean { void afte ...