1. 中介者进化

一个公司,开始时大家都是平等关系的,例如ABC三人。

开始,公司很小,他们都是多面手,每个人既做生产,也做销售,也做运输。

如下图所示:

随着生意越来越好,公司规模变大,然后他们就发现这样工作的话,要么生产跟不上,要么销售跟不上,要么运输跟不上。

他们发现了问题,因此他们决定改变现状,每个人专攻一个,要么生成,要么销售,要么运输,那么他们就变成了如下图所示的状态:

市场越来越大,公司也越来越大,在公司要抢占尽可能多的市场份额时发现他们要频繁的相互协调沟通,这耗费了他们大量的时间和精力,于是他们引入了外援。

此时,他们可以放心的各司其职,剩下的工作就交给M来处理。M就是中介者模式的中介。

上面的例子也许我们觉得理清楚他们之间的关系是件很简单的事情,不需要请外援。那么如果人数不仅限于3个人的情况,又如何呢?

你是否还有足够的自信能理清楚各自的职责呢?如果还可以的话,超过个位数达到几十上百的时候又如何呢?

请看这样是否更简单呢?

当然,如果对象数量达到一定级别时,更适合层状树组织就不在我们的考虑内了。

2. 中介者模式结构图:

    中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

实例代码:

/**
*Mediator Interface
*/
package com.journaldev.design.mediator;public interface ChatMediator {public void sendMessage(String msg, User user);void addUser(User user);
}/**
*Colleague Interface
*/
package com.journaldev.design.mediator;public abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator med, String name){this.mediator=med;this.name=name;}public abstract void send(String msg);public abstract void receive(String msg);
}/**
*Concrete Mediator
*/
package com.journaldev.design.mediator;import java.util.ArrayList;
import java.util.List;public class ChatMediatorImpl implements ChatMediator {private List<User> users;public ChatMediatorImpl(){this.users=new ArrayList<>();}@Overridepublic void addUser(User user){this.users.add(user);}@Overridepublic void sendMessage(String msg, User user) {for(User u : this.users){//message should not be received by the user sending itif(u != user){u.receive(msg);}}}}/**
*Concrete Colleague
*/
package com.journaldev.design.mediator;public class UserImpl extends User {public UserImpl(ChatMediator med, String name) {super(med, name);}@Overridepublic void send(String msg){System.out.println(this.name+": Sending Message="+msg);mediator.sendMessage(msg, this);}@Overridepublic void receive(String msg) {System.out.println(this.name+": Received Message:"+msg);}}/**
*Mediator Pattern Client
*/
package com.journaldev.design.mediator;public class ChatClient {public static void main(String[] args) {ChatMediator mediator = new ChatMediatorImpl();User user1 = new UserImpl(mediator, "Pankaj");User user2 = new UserImpl(mediator, "Lisa");User user3 = new UserImpl(mediator, "Saurabh");User user4 = new UserImpl(mediator, "David");mediator.addUser(user1);mediator.addUser(user2);mediator.addUser(user3);mediator.addUser(user4);user1.send("Hi All");}}

3.优缺点和使用场景

中介者模式的优点

  • 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
  • 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。
  • 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。

适用场景

在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。可以将网状结构变为星状结构,使同事类之间的关系变的清晰一些。

中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。

参考:1. http://www.cnblogs.com/hzcxy/archive/2013/03/08/2949533.html

2.http://hi.baidu.com/quakeii/item/c8b6b2e9c7d6ca236dabb8c4

3. http://www.journaldev.com/1730/mediator-design-pattern-in-java-example-tutorial

转载于:https://www.cnblogs.com/davidwang456/p/3641497.html

漫说中介者模式--创业公司成长记相关推荐

  1. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  2. Javascript设计模式之中介者模式

    前言:菜鸡也有梦想,而我的梦想就是进一个真正的互联网大厂.以前学习的时候没有系统的整理,从今天开始要保持每周写博客的习惯,希望自己可以有所成长.为了培养编程思维,决定从设计模式开始写起.我是通过读&l ...

  3. 设计模式:中介者模式(Mediator)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  4. 【我的物联网成长记5】如何进行物联网大数据分析?

    [摘要] 在物联网时代,数量庞大的"物"会产生海量数据,本文为您介绍两种基于物联网平台进行大数据分析的方法-实时分析和离线分析. 在物联网时代,数量庞大的"物" ...

  5. 【我的物联网成长记7】物联网主流通信协议解读【华为云分享】

    [摘要] 当今物联网的主流通信协议是CoAP/LWM2M协议和MQTT协议,本文将会为您分别解读这些协议的工作方式,了解它们的特点,助您选择最适合您的设备的通信协议. 通信协议又称为传输协议,用于定义 ...

  6. 【我的物联网成长记2】设备如何进行选型?

    [摘要] 在设备集成开发过程中,主要涉及三类用户: 模组厂商:提供Wifi.NB-IoT.2/3/4G等通信模组的厂商.设备厂商可以利用模组提供的能力接入到华为IoT平台. 设备厂商:开发并销售最终设 ...

  7. Mediator模式(C++中介者模式含个人Demo源码)

    重新温习GOF23到第18个中介者模式了,感觉还是蛮不错的,写了一个小小的Demo来解释下他们之间的关系. 中介者模式其实就相当于:中介,租房人,还有房主三者之间的关系. 房主A,租房人B首先联系了中 ...

  8. 蓝的成长记——追逐DBA(17):是分享,还是消费,在后IOE时代学会成长

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...

  9. ZYNQ 7000成长记——菜鸟从零开始学嵌入式linux(前言)

    ZYNQ 7000成长记--菜鸟从零开始学嵌入式linux(前言) 大概七八年前,大概是2010年,还在大学的时候就开始接触Linux,还买了一块天嵌的S3C2440的开发板.当时热情高涨,几天内就看 ...

最新文章

  1. 《C++ Primer Plus》第8章 函数探幽 学习笔记
  2. Struts1和Struts2的区别和对比
  3. 模式识别中Fisher分类器的Matlab实现及测试
  4. python 扯线木偶_Python计算器求助~求大神指导~QAQ急!
  5. em oracle 安装,oracle-EM安装
  6. Java学习小程序(6)随机加法运算器
  7. 米斯特白帽培训讲义(v2)漏洞篇 文件上传
  8. matlab2c使用c++实现matlab函数系列教程-normstat函数
  9. 【krpano】KRPano测试开发专用浏览器
  10. 蛇优化算法(Snake Optimizer)
  11. Beego项目打包部署到Linux服务器
  12. DLL的远程注入技术及注入dll函数调用
  13. js 输入数字金额同步转换为大写金额方法
  14. 萤石云视频预览、回放、自定义录制
  15. JVM 语言的兴衰 【The Rise and Fall of JVM Languages】
  16. 搜索下载免费操作系统(转)
  17. word文档如何画线条流程图_教你如何利用Word来画技术路线图!
  18. 研究生生涯规划(计划与安排)
  19. 创业投资——巴比伦富翁的理财课
  20. strtol strtoll strtoul strtoull应用

热门文章

  1. 投资计算机方面的策略构建,金融投资简单的策略分享和构建策略的基本思路
  2. java 市场_java市场前景怎样?
  3. 浏览器时间久了重新登录_注意!今日开始打印一建准考证,附各地时间及常见问题汇总...
  4. c语言位运算符读音,C语言六种位运算符
  5. mysql 单号,利用 MySQL 自增列生成订单号
  6. 计算机视觉基础:图像处理(上)
  7. pyspark 连接mysql
  8. python 、example
  9. c++可视化开发_页面可视化配置搭建工具技术要点
  10. Leetcode 58.最后一个单词的长度 (每日一题 20210705)