设计模式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)模式的其它翻译名称也很多,比如合成模式.树 ...
随机推荐
- [Apple开发者帐户帮助]五、管理标识符(3)删除应用程序ID
您可以在不再需要时删除App ID.但是,您无法删除上载到App Store Connect的应用程序的显式应用程序ID . 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左 ...
- python 46 边界圆角 、a_img_list标签 、伪类选择器
一:边界圆角 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- css3 文本模型
我前期是一名前端开发者,经常会遇到关于文本模型的问题,很多地方我们会经常遇到这种问题.例如栏目的标题,在设计师给我们图的时候并不会考虑到标题的长度,所以我们自己开发的过程中自己注意这一点. 首先和大家 ...
- C - Domino piling
Problem description You are given a rectangular board of M × N squares. Also you are given an unlimi ...
- NoSQL概念
NoSQL是非关系型数据库,即not only sql,key/value键值对存储. 现有Nosql DB产品:Redis/MongoDB/Memcached等等. SQL Sever是关系型数据库 ...
- 2018.10.9 上线发现elasticsearch写入速度超级慢,原来罪魁祸首是阿里云服务的OSS的锅
问题描述: 按照项目计划,今天上线部署日志系统(收集线上的所有日志,便于问题排查). 运维按照以前的部署过程,部署elasticsearch,部署结束之后,通过x-pack的monitor发现elas ...
- java Queue中 remove/poll, add/offer, element/peek区别
offer,add区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝. 这时新的 offer 方法就可以起作用了.它不是对调用 add() 方法抛出一个 unche ...
- PythonOpenCV:MLP用于最近邻搜索
一:简单C++版本的链接: http://blog.csdn.net/kaka20080622/article/details/9039749 OpenCV的ml模块实现了人工神经网络(Artific ...
- 使用Java生成具有安全哈希的QR码
这是关于如何在Java中使用salt生成QR代码和安全散列字符串的分步教程. 首先,需要一个可以处理QR码的库,我决定使用Zebra Crossing("ZXing")库,因为它简 ...
- 复习MySQL④查询功能、连接方式、联合查询
用select语句查询: select〈目标列组〉 from〈数据源〉 [where〈元组选择条件〉] [group by〈分列组〉[having 〈组选择条件〉]] [order by〈排序列1〉〈 ...