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年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
随机推荐
- DirectX12 3D 游戏开发与实战第七章内容(下)
利用Direct3D绘制几何体(续) 学习目标 学会一种无须每帧都要刷新命令队列的渲染流程,由此来优化程序的性能 了解另外两种跟签名参数类型:根描述符和根常量 探索如何在程序中生成和绘制常见的几何体, ...
- expr判断文件名以固定格式结尾
#!/bin/bash if expr "$1" : ".*\.sh" &>/dev/null then echo "okok" ...
- 【Python小试】计算蛋白序列中指定氨基酸所占的比例
编码 from __future__ import division def get_aa_percentage(protein, aa_list=['A','I','L','M','F','W',' ...
- zabbix_get
zabbix_get是一个命令行工具,可用于从一个远程的Zabbix探针获取监控数据. 1.2 用法 zabbix_get [-hV] [-s <host name or IP> ] [- ...
- EXCEL-批量修改列宽
WPS:先用鼠标选中一列,然后,长按ctrl键并且用鼠标选中剩余想要统一列宽的列,松开ctrl键,鼠标落在刚选中的任意一列的抬头上,鼠标右键,选择列宽,设置统一列宽即可.
- 开始读 Go 源码了
原文链接: 开始读 Go 源码了 学完 Go 的基础知识已经有一段时间了,那么接下来应该学什么呢?有几个方向可以考虑,比如说 Web 开发,网络编程等. 在下一阶段的学习之前,写了一个开源项目|Go ...
- JuiceFS 数据读写流程详解
对于文件系统而言,其读写的效率对整体的系统性能有决定性的影响,本文我们将通过介绍 JuiceFS 的读写请求处理流程,让大家对 JuiceFS 的特性有更进一步的了解. 写入流程 JuiceFS 对大 ...
- android studio Please configure Android SDK / please select Android SDK
有可能是sdk文件损坏造成的. file->settings->appearance&behavior->system settings->android sdk-&g ...
- JavaScript小数、百分数的转换
百分数转化为小数 function toPoint(percent){ var str=percent.replace("%",""); str= str/10 ...
- 案例分析 CAN OPEN 调试记录 进度
2020.12.29 发现一片博客:https://blog.csdn.net/harrycomeon/article/details/94650103 需要一个硬件:CAN分析仪,网上200元左右. ...