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 游戏开发与实战第十章内容(下)
仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...
- GWAS在农业上应用
农业的组学技术应用虽然落后于人的研究,这是什么意义的问题,但有时农业基因组有自己无可比拟的优势,那就是材料.下面介绍GWAS应用. GWAS(Genome-wide association study ...
- R语言与医学统计图形-【9】过渡函数qplot
ggplot2绘图系统 基础绘图包向ggplot2过渡--qplot 绘图理念的不同: 基础绘图包是先铺好画布,再在这张画布上作图(常规思维): ggplot2打破常规,采用图层叠加的方法. qplo ...
- 【Python小试】去除核酸特定长度的接头序列
输入 input.txt ATTCGATTATAAGCTCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATC ATTCGATTATAAGCACTGATCGATCGATCG ...
- Redis源码解析(1)
在文章的开头我们把所有服务端文件列出来,并且标示出其作用: adlist.c //双向链表 ae.c //事件驱动 ae_epoll.c //epoll接口, linux用 ae_kqueue.c / ...
- Requests的安装和使用
一.Requests的安装1.pip3 install requests2.验证 import requests 不报错即可
- java9 模块化 jigsaw
java9并没有在语言层面做出很多改变,而是致力于一些新特性,如模块化,其核心就是解决历史遗留问题,为以后的jar包森林理清道路.模块化是一个很大的命题,就不讲那么细致了,关于java9的特性也有很多 ...
- jenkins之授权和权限管理
#:创建角色,给角色授权,然后创建用户,将用户加入到角色(前提先安装插件) #:先将之前的卸载掉 #:然后重启服务,在可选插件搜索Role #:装完重启服务 root@ubuntu:~# system ...
- liunx 安装ActiveMQ 及 spring boot 初步整合 activemq
源码地址: https://gitee.com/kevin9401/microservice.git 一.安装 ActiveMQ: 1. 下载 ActiveMQ wget https://arch ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(3. 用ansible管理机器和软件)
1. 简介 1.1. 公司环境使用的puppet,但是我更喜欢ansible,原因有二,第一,我是红帽的忠粉:),第二,我对python比较熟悉 1.2. ansible官方网站:https://ww ...