设计模式C++实现——组合模式
模式定义:
组合模式同意你将对象组合成树形结构来表现“总体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
这个模式可以创建一个树形结构,在同一个结构中处理嵌套菜单和菜单项组。通过菜单和项放在同样结构中,我们创建了一个“总体/部分”层次结构,即由菜单和菜单项组成的对象树。使用组合结构,我们能把同样的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的区别。
模式结构:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Fsa2Vya2Fscg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Component:
为组合中的对象声明接口;
在适当情况下实现全部类共同拥有接口的缺省行为。
声明一个接口用于訪问管理Component的子组件
在递归结构中定义一个接口,用于訪问一个父部件。并在合适的情况下实现它
Leaf:
在组合中表示叶节点对象,叶节点没有子节点,并定义其行为
Composite:
定义有子部件的那些部件的行为
存储子部件
实现与子部件有关的操作
Client:
通过Component接口操作组合件和个别对象。
举例:
在迭代器样例中,我们希望在午餐餐单中添加一份跌点餐单,也就是说希望能让甜点餐单变成午餐餐单的一个元素。
我们能够用组合模式解决问题:一開始我们创建一个组件接口作为餐单和菜单项的共同接口。让我们能够用统一的做法来处理菜单和菜单项。
换句话说,我们能够针对菜单或菜单项调用同样的方法。然后实现菜单项和组合菜单组件,以及他们各自的方法。
UML设计:
编程实现及运行结果:
#include <iostream>
#include <vector>
#include <list>
#include <string> using namespace std; //菜单和菜单项共同的组件
class MenuComponent
{
public:
virtual void add(MenuComponent* menuComponent)
{
throw exception("add error!");
} virtual void remove(MenuComponent* menuComponent)
{
throw exception("remove error!");
} virtual MenuComponent* getChild(int i)
{
throw exception("getChild error");
} virtual string getName()
{
throw exception("getName error");
} virtual string getDescription()
{
throw exception("getDescription error");
} virtual double getPrice()
{
throw exception("getPrice error");
} virtual void print()
{
throw exception("print error");
}
}; //菜单项类
class MenuItem : public MenuComponent
{
public:
MenuItem(){}
MenuItem(string na, string descrip, double pric)
{
name = na;
description = descrip;
price = pric;
} string getName()
{
return name;
} string getDescription()
{
return description;
} double getPrice()
{
return price;
} void print()
{
cout << " " << getName() << ", " << getPrice()
<<" ---" << getDescription() << endl;
}
private:
string name;
string description;
double price;
};
//组合菜单类
class Menu : public MenuComponent
{
public:
Menu(string nam, string descri)
{
name = nam;
description = descri;
} void add(MenuComponent* pMenuComponent)
{
pMenuComponents.push_back(pMenuComponent);
} void remove(MenuComponent* pMenuComponent)
{
vector<MenuComponent*>::iterator iter = pMenuComponents.begin();
for(; iter!=pMenuComponents.end(); ++iter)
{
if(*iter == pMenuComponent)
{
pMenuComponents.erase(iter);
}
}
} MenuComponent* getChild(int i)
{
return pMenuComponents[i];
} string getName()
{
return name;
} string getDescription()
{
return description;
} void print()
{
cout << endl << getName() << ", " << getDescription() << endl << "--------------" << endl;
vector<MenuComponent*>::iterator iter = pMenuComponents.begin();
while(iter != pMenuComponents.end())
{
MenuComponent* pMenuComponent = *iter;
pMenuComponent->print();
++iter;
}
}
private:
vector<MenuComponent*> pMenuComponents;
string name;
string description;
}; //服务生类
class Waitress
{
public:
Waitress(MenuComponent* all_Menus)
{
allMenus = all_Menus;
} void printMenu()
{
allMenus->print();
}
private:
MenuComponent* allMenus;
};
//客户代码
int main()
{
MenuComponent* pancakeHouseMenu = new Menu("PANCAKE HOUSE MENU", "Breakfast");
MenuComponent* dinerMenu = new Menu("Diner MENU", "Lunch");
MenuComponent* dessertMenu = new Menu("DESSERT MENU","Dessert of coure!"); MenuComponent* allMenus = new Menu("ALL Menus", "All menus combined"); allMenus->add(pancakeHouseMenu);
allMenus->add(dinerMenu);
dinerMenu->add(new MenuItem("Pasta","Spaheti with Sauce", 3.89)); dinerMenu->add(dessertMenu);
dessertMenu->add(new MenuItem("Apple Pie", "App pie with a cruse", 1.59)); Waitress* waitress = new Waitress(allMenus);
waitress->printMenu();
return 0;
}
运行结果:
ALLMenus, All menus combined
--------------
设计模式C++实现——组合模式的更多相关文章
- java23种设计模式——八、组合模式
目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...
- [设计模式] javascript 之 组合模式
组合模式说明 组合模式用于简单化,一致化对单组件和复合组件的使用:其实它就是一棵树: 这棵树有且只有一个根,访问入口,如果它不是一棵空树,那么由一个或几个树枝节点以及子叶节点组成,每个树枝节点还包含自 ...
- 设计模式学习之组合模式(Composite,结构型模式)(10)
转载地址:http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系 ...
- 设计模式之:组合模式(Composite)
支持原创:http://blog.csdn.net/hguisu/article/details/7530783 设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构 ...
- [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表
所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...
- C#设计模式之十组合模式(Composite)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第四个模式,该模式是[组合模式],英文名称是:Composite Pattern.当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达 ...
- 设计模式学习心得<组合模式 Composite>
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
- C#设计模式之九组合模式(Composite Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第四个模式,该模式是[组合模式],英文名称是:Composite Pattern.当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达的意 ...
- Java设计模式学习记录-组合模式
前言 今天要介绍的设计模式是组合模式,组合模式也是结构型设计模式的一种,它主要体现了整体与部分的关系,其典型的应用就是树形结构.组合是一组对象,其中的对象可能包含一个其他对象,也可能包含一组其他对象. ...
- java设计模式-----13、组合模式
Composite模式也叫组合模式,是构造型的设计模式之一.通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树. 组合(Composite)模式的其它翻译名称也很多,比如合成模式.树 ...
随机推荐
- 浅谈自学Python之路(购物车程序练习)
购物车程序练习 今天我们来做一个购物车的程序联系,首先要理清思路 购物车程序需要用到什么知识点 需要用到哪些循环 程序编写过程中考虑值的类型,是int型还是字符串 如果值为字符串该怎么转成int型 用 ...
- [Swift]LeetCode1071.字符串的最大公因子 | Greatest Common Divisor of Strings
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- weui&flexible布局
1.weui 一开始以为只能用于小程序中,原来分两种:weui-wxss-master和weui-master.真的是强大的不得了,把设计好的样式和功能封装.然后分类,有明确的层级和逻辑,感动!!值得 ...
- BZOJ 1407 exgcd
思路: 数据范围不大.. 那我们就枚举M好了.. 再两两判断一下有没有冲突 怎么判断呢? exgcd!!! p[i]*k+c[i]=p[j]*k+c[j] (mod m) (p[j]-p[i])*k ...
- CentOS6 在线安装PostgreSQL10
本文主要通过实际案例介绍如何在CentOS6环境中在线安装PostgreSQL10,安装环境需具备能够使用yum在线安装功能.具体安装步骤如下, 1 下载对应版本的PGDG文件 从https://yu ...
- java中强制类型转换时,高位数截取成低位数的方法
/** * 强制类型转换中的补码.反码.原码一搞清楚 */ int b=233;//正整数强转 System.out.println((byte)b); //负数:原码的绝对值取反再加一 符号为不变 ...
- nginx编译安装新模块
nginx的模块是需要重新编译nginx,而不是像apache一样配置文件引用.so 这里以安装第三方ngx_http_google_filter_module模块为例 下载第三方扩展模块ngx_ht ...
- elasticsearch性能调优
转载 http://www.cnblogs.com/hseagle/p/6015245.html 该es调优版本可能有低,但是思想主体不变,不合适的参数可以自己找最新的版本相应的替代,或者增删 ela ...
- Android开放百度地图集成
1.创建应用 获取AK (我理解为Application key) 通过百度账号登录百度地图开放平台,进入API控制台 http://lbsyun.baidu.com/apiconsole/key ...
- 对学Oracle数据库初学者的开场篇
前言:因为项目原因,近期开始学习Oracle数据库.Oracle是目前最流行的数据库之一,功能强大,性能卓越,相对的学习的难度还是不小.我打算将自己的学习过程记录下来,做个积累,方便自己和其他的学习者 ...