设计模式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)模式的其它翻译名称也很多,比如合成模式.树 ...
随机推荐
- 网络简要<入门篇>对应配置代码
交换机的配置 (1)交换机的模式: switch> 用户模式,可以查看设备的部分内容 SW-3ceng>enable SW-3ceng# 进入特权模式,可以查看更多 ...
- 【题解】【CodeForces712C】Memory and De-Evolution
[题目描述] 给定一个边长为xx的正三角形,现在每秒钟你可以改变其中一条边的长度(修改量整数),在改变过程中,每秒钟都需要保证改变后的三角形是合法的,且变成均为正整数. 现在需要最终把三角形改变成边长 ...
- POJ 2186 Tarjan
题意:有n(n<=10000)头牛,每头牛都想成为最受欢迎的牛,给出m(m<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不是相互的,那么就是说1欢迎2不代表2欢迎1, ...
- dom转换成jquery对象
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 另一种压缩图片的方法---Machine learning 之 PCA(Principle Component Analysis)
PCA最主要的用途是用来减少特征向量的数目,N个特征向量 减小到 K个特征向量.如果为了可视化,k可以使3 或者 2.这样可以加速算法的学习速度. PCA用来压缩图像同一有效. 具体方式以及原理在gi ...
- Lambda&Linq
var list = new List<Model> { , UserName = ", Email = "zhang3@yoy.com"}, , UserN ...
- C#方法的练习
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Demo ...
- 【Oracle】体系结构
1. 理解实例和数据库 ☞ 实例是一组后台进程和共享内存 ☞ 数据库是磁盘上存储的数据集合 ☞ 实例“一生”只能装载并打开一个数据库 ☞ 数据库可以由一个或多个实例(RAC)装载和打开 [oracle ...
- ASP.NET MVC5 网站开发实践(一)
一.开发环境 1.开发环境: Visual Studio 2013 2.数据库:Sql Server 2012 3.代码管理:TFS(微软免费提供的) 说明:VS2013与vs2012感觉变化不大,我 ...
- Ad hoc polymorphism
与面向对象中的接口类或抽象类中定义的函数组类似: 函数的具体执行依赖与函数医用的类型. In programming languages, ad-hoc polymorphism[1] is a ki ...