转载自:https://mp.weixin.qq.com/s/EsR5hZXNvB6lXsd8rhs4bw

中介,作用于多个事物之间充当交互沟通的媒介。我们的生活中有各种各样的媒介,比如一些传统媒体,书刊杂志,报纸,把信息传递给读者。再比如利用电子信息技术的互联网,作为一种新媒体,不单可以更高效地把信息传递给用户,而且可以反向地获得用户反馈评论,用户与用户之间亦可以进行沟通,这种全终端双向互通是传统媒体所不能及的。
除此之外,再如婚介所、房产中介、交换机组网、现代电子商务、C2C购物平台、手机、即时通软件等等,这些都与我们的生活息息相关,离开它们我们将举步维艰。其实不管是任何中介,其本质都是相同的,都是充当中间媒介的角色,并达成多方业务互通的目的。

首先我们以最简单的模型来解决问题,以两个人交谈为例,其实他们之间并不需要任何第三方媒介,而是一对一直接沟通,看代码。

public class People {private String name;//用名字来区别人。private People other;//持有对方的引用。public String getName() {return this.name;}public People(String name) {this.name = name;//初始化必须起名。}public void connect(People other) {this.other = other;//连接方法中注入对方引用。}public void talk(String msg) {other.listen(msg);//我方说话时,对方聆听。}public void listen(String msg) {//聆听来自对方的声音System.out.println(other.getName() + " 对 " + this.name + " 说:" + msg);}
}

一切就绪,两人开始沟通。

public class Main {public static void main(String args[]) {People p3 = new People("张三");People p4 = new People("李四");p3.connect(p4);p4.connect(p3);p3.talk("你好。");p4.talk("早上好,三哥。");}/****************************输出结果:张三 对 李四 说:你好。李四 对 张三 说:早上好,三哥。*****************************/
}

从People类中我们可以看到,沟通只只能在两人之间进行,而且各自都持有对方对象的引用,以便把消息传递给对方的监听方法。这种模式虽然简单,但耦合性太强,你中有我,我中有你,谁也离不开谁。试想如果再有多个人加入交谈,那每个人都要持有其他所有人的引用了,这时会陷入一种多对多的关联陷阱,对象关系变得复杂不堪,如蛛网般难以维护。
我们就拿群聊天室举例,每当有人加入或离开,都要把每个人持有的其他人的引用关系更新一遍,发消息时更是繁琐不堪,重复工作显得非常多余。那么如何解决这个问题呢?我们开始进行思考,为何不把重复的部分抽离出来呢,也就是把对方的引用放在一个中介类里面去统一维护起来,于是设计更改如下。
可以看到,每个用户不再所持有其他所有用户的引用了,取而代之的是聊天室的引用,这样引用关系瞬间变得明朗起来,开始我们的代码重构。

public class User {private String name;//名字private ChatRoom chatRoom;//聊天室引用public User(String name) {this.name = name;//初始化必须起名字}public String getName() {return this.name;}public void login(ChatRoom chatRoom) {//用户登陆chatRoom.connect(this);//调用聊天室连接方法this.chatRoom = chatRoom;//注入聊天室引用}public void talk(String msg) {//用户发言chatRoom.sendMsg(this, msg);//给聊天室发消息}public void listen(User fromWhom, String msg) {//且听风吟System.out.print("【"+this.name+"的对话框】");System.out.println(fromWhom.getName() + " 说: " + msg);}
}

可以看到第14行,用户登陆聊天室时不再是连接对方了,而是连接通知聊天室并告知:“有人进来了请进行注册”,然后记录下来用户当前所在聊天室的引用。第19行,用户发言时也不是直接找对方了,而是把消息扔给聊天室处理。第23行,聆听方法同样也是,将来会接受来自聊天室的声音。很显然,一切沟通都与是中介聊天室进行,这样用户之间就实现了解耦的目的。当然,用户当然还需要注销离开聊天室,请读者可自行练习添加,下面接着写我们的聊天室中介类。

public class ChatRoom {private String name;//聊天室命名public ChatRoom(String name) {this.name = name;//初始化必须命名聊天室}List<User> users = new ArrayList<>();//聊天室里的用户们public void connect(User user) {this.users.add(user);//用户进入聊天室加入列表。System.out.print("欢迎【");System.out.print(user.getName());System.out.println("】加入聊天室【" + this.name + "】");}public void sendMsg(User fromWhom, String msg) {// 循环所有用户,只发消息给非发送方fromWhom。users.stream().filter(user -> !user.equals(fromWhom))//过滤掉发送方fromWhom.forEach(toWhom -> toWhom.listen(fromWhom, msg));//发送消息给剩下的所有人}
}

这里我们新建一个聊天室作为中介类,所有参与者登陆时调用第10行的connect方法进入聊天室,并记录其引用到users列表中。第17行,当用户发消息到平台我们再转发给其他人,这里利用Java8的流和Lambda表达式进行过滤(User类的equals方法请自行加入),并循环调用所有接收方的listen方法即可。

为了说明问题,我们这里只是保持最简单的方式,如果某天情况变得复杂,有了不同的用户,或是聊天室也各不相同并加入了各自的特性,那我们就需要继续重构,抽象聊天室类,抽象用户类,读者可以灵活运用,这里就不做赘述了。

其实中介模式不止是在生活中广泛应用,在软件架构中也非常常见,当下流行的微服务分布式软件架构所用到的注册中心,例如最常用到的云组件Eureka Server,其作用就是为众多分布式服务提供注册发现服务,它正是充当像中介一样的角色。

还记得之前讲到的组合模式中的树型结构吧,它主要描述的是子节点与父节点的关系。
而中介模式更像是网络拓扑中的星型结构,它描述了众节点与中心点的关系。
对像之间显式地互相引用越多,意味着依赖性越强,独立性越差,不利于代码维护与扩展,同时多方沟通的任务也应交由中间平台来完成,每个类应只具备各自该有的功能,这便是高内聚低耦合的设计标准。中介模式符合迪米特法则,它解决了对象间过度耦合、复杂频繁交互的问题,打破了你中有我,我中有你的相互依赖,第三方的介入有助于双方调停,打破如胶似漆、纠缠不休的关系,让他们之间变得松散、自由、独立。

设计模式是什么鬼(中介)相关推荐

  1. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  2. 设计模式是什么鬼(模板方法)

    转自:设计模式是什么鬼(模板方法) 面向对象,是对事物属性与行为的封装,方法,指的就是行为.模板方法,显而易见是说某个方法充当了模板的作用,其充分利用了抽象类虚实结合的特性,虚部抽象预留,实部固定延续 ...

  3. 设计模式是什么鬼(状态)

    转自:设计模式是什么鬼(状态) 状态State,指某事物所处的状况或形态,比如水的三态,零下会变成固态冰,常温会是液态水,100℃会蒸发成气态的水蒸气. 在这个地球生态系统中,水的总量并不会增加,也不 ...

  4. 设计模式是什么鬼(原型)

    转自:设计模式是什么鬼(原型) 原型(Prototype)是什么意思?工业生产中通常是指在量产之前研发出的概念实现,如果可行性满足即可参照原型进行量产.有人说了,那不就是印章?其实这并不怎么贴切,印章 ...

  5. 设计模式是什么鬼(单例)

    转自:设计模式是什么鬼(单例) 之前我们讲过面向对象以及封装.继承.多态三大特性,底子打好了那我们就把设计模式一个个拆开来看看到底都是神些什么鬼,我们先从简单的单例说起吧.单例,顾名思义,整个系统其实 ...

  6. java mediator模式_设计模式之Mediator 中介者模式 - 解道Jdon

    设计模式目录 >> 当前页 设计模式之Mediator(中介者) 板桥里人 http://www.jdon.com 2002/05/05 Mediator中介者模式定义: 用一个中介对象来 ...

  7. 设计模式是什么鬼3(原型)

    设计模式是什么鬼(原型) 原创: 凸凹里歐 Java知音 Java知音 微信号 Java_friends 功能介绍 专注于Java领域,每天推送全网高质量技术文章,热门开源项目,实用视频教程等.致力打 ...

  8. 设计模式是什么鬼(解释器)

    原文链接:设计模式是什么鬼(解释器) 更多文章,欢迎访问:Java知音,一个专注于技术分享的网站 解释,一定是针对某种语言的拆解.释意,并按照文法翻译.转换成另一种表达形式以达到目标能够理解的目的.比 ...

  9. JAVA设计模式什么鬼(中介)——作者:凸凹里歐

    中介,作用于多个事物之间充当交互沟通的媒介.我们的生活中有各种各样的媒介,比如一些传统媒体,书刊杂志,报纸,把信息传递给读者.再比如利用电子信息技术的互联网,作为一种新媒体,不单可以更高效地把信息传递 ...

最新文章

  1. 在koa中想要优雅的发送响应?看这就对了
  2. controll层跳转页面_SpringMVC controller控制页面跳转 | 学步园
  3. 3.1 普通型生成函数
  4. linux平台 使用dlopen接口调用HelloWorld动态库简单实例
  5. 文本框点击后文字消失总结
  6. [vue] 如何在子组件中访问父组件的实例?
  7. 1.窗体与界面设计-菜单应用实例
  8. 【工具使用系列】关于 MATLAB Embedded Coder, 你需要知道的事
  9. php滑动轮播效果,js实现移动端手指滑动轮播图效果
  10. python和c 的区别-Python和c语言的主要区别在哪
  11. vue-scroller的使用
  12. 你真的要收下这份大礼包!!
  13. 高德地图画带箭头的线_华耀室佳发光顶角线能否代替传统回型顶角线呢?
  14. cad画多段线时不显示轨迹_cad画多段线时不显示轨迹_CAD画多段线的时候看不到预览效果的解决方法...
  15. 使用selenium登录QQ空间
  16. 建站之星v2.7快速更换模版
  17. 分支定界法求解整数规划
  18. NAT地址转换顺序:inside→outside先路由再转换;outside→inside先转换再路由
  19. Redis学习之Master/Salve十一
  20. activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.p

热门文章

  1. 计算机网络原理练习题及答案
  2. Java编译时异常与运行时异常的区别
  3. python中的四舍六入五平分
  4. Spring Cloud 微服务及五大组件介绍
  5. 高德地图多边形地图的设置
  6. 高德地图添加图片覆盖物,限制拖拽缩放范围
  7. 跨境电商出口退货指南
  8. 批处理常用命令总结 - 批处理命令简介
  9. 三亚旅游攻略!三亚亚龙湾五号度假别墅酒店攻略
  10. Introduction to Flash NetConnection/NetStream