设计模式十八:mediator(中介者模式)——对象行为型模式
mediator(中介者模式)——对象行为型模式
1.意图
用一个中介对象来封装一系列的对象交互。中介者使不同对象不需要显式地相互引用,从而使其松散耦合,从而使得可以独立地改变他们之间的交互。
2.动机
面向对象设计鼓励将行为分部到各个对象中,这种分部可能会导致对象间有许多连接。在最坏的情况下,每个对象都知道其他所有的对象。
虽然将一个系统分隔成很多对象通常会增加可复用性,但是对象间的相互连接的激增又会降低其可复用性。
可以通过将集体行为封装在一个单独的中介者对象中以避免这个问题,中介者负责控制和协调对象间的交互。中介者充当一个中介以使组中的对象不再相互显式的引用。这些对象仅知道中介者,从而减少了相互连接的数目。
3.适用性
1)一组对象定义良好但是以复杂的方式进行通信。产生相互依赖的关系结构混乱而且难以理解
2)一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象
3)想定制一个分布在各个类中的行为,而又不想产生太多的子类
4.结构
参考:http://www.cnblogs.com/singlepine/archive/2005/10/30/265007.html
5.参与者
mediator中介者
中介者定义一个借口用于与各个同时对象通信
concreteMediator具体中介者
具体中介者通过协调各同事对象实现协作行为
了解并维护它的各个同事
colleague class同事类
每个同事类都知道它的中介者对象
每一个同事对象在需要与其他的同事通信的时候,与它的中介者通信
6.协作
同事向一个中介者对象发送和接收请求。中介者在各个同事之间适当的转发请求以实现协作。
7.效果
1)减少子类的生成
2)将各个colleague解耦
3)简化对象的协议
4)对对象如何让协作进行了抽象
5)使控制集中化
8.实现
1)忽略抽象的mediator类
当各个colleague仅仅与一个mediator类通信时,没有必要定义一个抽象的mediator类
2)colleague——mediator通信
当一个感兴趣的事件发生时,colleague必须与其mediator通信。
9.代码示例
#include<iostream> #include<string> using namespace std;class company { public:company(string str){name = str;}void setName(string str){name = str;}string getName(){return name;}virtual void sale(){};virtual void buy(){}; private:string name; };class chinaCompany:public company { public:chinaCompany(string str):company(str){};void sale(){cout<<getName()<<" sale sth"<<endl;}void buy(){cout<<getName()<<" buy sth"<<endl;} };class AmericaCompany:public company { public:AmericaCompany(string str):company(str){};void sale(){cout<<getName()<<" sale sth"<<endl;}void buy(){cout<<getName()<<" buy sth"<<endl;} };class companyUnion { public:companyUnion(){for(int i=0;i<10;i++)list[i]=0;maxlen=0;}void join(company *c){list[maxlen]=c;maxlen++;cout<<c->getName()<<" join the company union"<<endl;}int find(company *c){for(int i=0;i<maxlen;i++){if(c->getName() == list[i]->getName())return i;}return -1;}void business(company *from, company *to){int source = find(from);int dest = find(to);if(source == dest){cout<<"you can't sell goods to yourself"<<endl;return;}list[source]->sale();list[dest]->buy();} private:company *list[10];int maxlen; };int main() {company *huawei = new chinaCompany("huawei");company *zet = new chinaCompany("ZET");company *cisco = new AmericaCompany("cisco");company *at = new AmericaCompany("AT&T");companyUnion *wto = new companyUnion();wto->join(huawei);wto->join(zet);wto->join(cisco);wto->join(at);cout<<endl;wto->business(huawei, zet);cout<<endl;wto->business(huawei, cisco);cout<<endl;wto->business(huawei, huawei);cout<<endl;wto->business(at, zet);cout<<endl;wto->business(cisco, zet);cout<<endl;wto->business(at, cisco);system("pause");return 0; }
运行结果:
10.相关模式
facade模式
与中介者的不同是他是对一个对象的子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,仅有facade对象向这个子系统提出请求,但反之则不行。相反的,mediator提供各个colleague对象不支持或不能支持的协作行为,且是双向的。
colleague可使用observer模式和mediator通信
转载于:https://www.cnblogs.com/w0w0/archive/2012/05/21/2511839.html
设计模式十八:mediator(中介者模式)——对象行为型模式相关推荐
- Mediator(中介者)--对象行为型模式
Mediator(中介者)–对象行为型模式 一.意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 二.动机 1.在软 ...
- 设计模式之原型法(ProtoType)----对象创建型模式
设计模式之原型法(ProtoType)----对象创建型模式 1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用性 1)当要实例化的类是在运行时刻指定时,例如,通过动 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式笔记十八:中介者模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 中介者模式(Mediator Pattern) 是用来降低多个对象和类之 ...
- 设计模式(十八)—— 中介者模式(定义、案例分析、特点、缺点)
文章目录 前言 正文 一.定义 二.情景假设 三.情景分析 四. 模式分析 (1) 模式特点 (2) 模式缺点 五.使用情景 六.拓展与延申 总结 前言 文章内容主要参考了刘伟主编的<设计模式( ...
- Typescript玩转设计模式 之 对象行为型模式(上)
作者简介 joey 蚂蚁金服·数据体验技术团队 继前面几篇设计模式文章之后,这篇介绍5个对象行为型设计模式. Chain of Responsibility(职责链) 意图 使多个对象都有机会处理请求 ...
- 设计模式-对象行为型模式
[对象行为型模式]涉及到算法和对象间职责的分配,描述了对象和类的模式,以及它们之间的通信模式. 用来对类或对象怎样交互和怎样分配职责进行描述 1. 策略模式(strategy) ...
- 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)
设计模式之生成器模式(对象创建型模式) 1.定义/概念 将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示. 2.生成模式角色 Builder: 生成器接口,定义创建一个Produ ...
- 5.8 设计模式之State(状态)—对象行为型模式
5.8 State(状态)-对象行为型模式 参考文章 意图 状态模式是一种行为设计模式, 改变一个对象的内部状态进而改变其行为. 问题及情景 状态模式与有限状态机的概念紧密相关. 其主要思想是程序在任 ...
最新文章
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
- 芒果TV崩了?项目组在家办公效率不行呀!
- 【CUDA开发】 Check failed: error == cudaSuccess (8 vs. 0) invalid device function
- li鼠标悬浮手势样式
- hive和hadoop关系
- Hibernate错误记录
- cocos2d-x 使用BMFont生成中文字体并应用
- win10虚拟显示器开发
- 数学建模之传染病SIR模型(新冠真实数据)
- android有道翻译api,有道智云自然翻译服务API
- 文学类容易发表的期刊或者学报有哪些?
- Golang 并发之锁
- Flink SQL xxx is not serializable. The object probably contains or references non serializable field
- 家用电脑搭建外网服务器
- 多路温度采集控制系统(2)需求分析
- zte手机android手机怎么刷机,ZTE中兴U880手机刷机详细图文教程
- 华为云如何绑定/解绑二次验证码/虚拟MFA/谷歌身份验证器?
- FPGA的学习:状态机的实现(三)
- 物联网智能家居需要服务器吗,智能家居设备常见的两种配网/联网方式
- 数字信号处理课程实验
热门文章
- 计算机三维技术在影视广告设计中应用的研究 罗晋,计算机三维技术在影视广告设计中应用的研究...
- wepe 装linux ubuntu,Ubuntu16.04下安装Wechat的实现方法
- 阿里创业员工分享公司的BI选型之路!自研、开源的坑都踩过
- 深入浅出,教你一步步实现数据分析入门、进阶
- ubuntu 11 mysql_Ubuntu 11.10是否包含MySQL 5.5?
- ios 分段 判断 小说阅读器_还在用别的小说阅读器?今天教你用Python制作简易小说阅读器!...
- 华为鸿蒙系统是指芯片吗_没有了芯片,华为能靠鸿蒙OS系统打出差异化吗?
- python代码覆盖率测试_Python代码覆盖率分析工具----Coverage
- 决策树 随机森林 xgboost_从决策树到随机森林理论篇从人话到鬼话:看不懂来找我麻烦...
- 开源java博客tale_用Tale快速搭建个人博客