中介,作用于多个事物之间充当交互沟通的媒介。我们的生活中有各种各样的媒介,比如一些传统媒体,书刊杂志,报纸,把信息传递给读者。再比如利用电子信息技术的互联网,作为一种新媒体,不单可以更高效地把信息传递给用户,而且可以反向地获得用户反馈评论,用户与用户之间亦可以进行沟通,这种全终端双向互通是传统媒体所不能及的。

除此之外,再如婚介所、房产中介、交换机组网、现代电子商务、C2C购物平台、手机、即时通软件等等,这些都与我们的生活息息相关,离开它们我们将举步维艰。其实不管是任何中介,其本质都是相同的,都是充当中间媒介的角色,并达成多方业务互通的目的。

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

 1   public class People {2  private String name;//用名字来区别人。3  private People other;//持有对方的引用。45  public String getName() {6    return this.name;7  }89  public People(String name) {
10    this.name = name;//初始化必须起名。
11  }
12
13  public void connect(People other) {
14    this.other = other;//连接方法中注入对方引用。
15  }
16
17  public void talk(String msg) {
18    other.listen(msg);//我方说话时,对方聆听。
19  }
20
21  public void listen(String msg) {
22    //聆听来自对方的声音
23    System.out.println(
24        other.getName() + " 对 " + this.name + " 说:" + msg
25    );
26  }
27}

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

 1  public class Main {2  public static void main(String args[]) {3    People p3 = new People("张三");4    People p4 = new People("李四");56    p3.connect(p4);7    p4.connect(p3);89    p3.talk("你好。");
10    p4.talk("早上好,三哥。");
11  }
12  /****************************
13  输出结果:
14    张三 对 李四 说:你好。
15    李四 对 张三 说:早上好,三哥。
16  *****************************/
17}

从People类中我们可以看到,沟通只只能在两人之间进行,而且各自都持有对方对象的引用,以便把消息传递给对方的监听方法。这种模式虽然简单,但耦合性太强,你中有我,我中有你,谁也离不开谁。试想如果再有多个人加入交谈,那每个人都要持有其他所有人的引用了,这时会陷入一种多对多的关联陷阱,对象关系变得复杂不堪,如蛛网般难以维护。

我们就拿群聊天室举例,每当有人加入或离开,都要把每个人持有的其他人的引用关系更新一遍,发消息时更是繁琐不堪,重复工作显得非常多余。那么如何解决这个问题呢?我们开始进行思考,为何不把重复的部分抽离出来呢,也就是把对方的引用放在一个中介类里面去统一维护起来,于是设计更改如下。

可以看到,每个用户不再所持有其他所有用户的引用了,取而代之的是聊天室的引用,这样引用关系瞬间变得明朗起来,开始我们的代码重构。

 1  public class User {2    private String name;//名字34    private ChatRoom chatRoom;//聊天室引用56    public User(String name) {7        this.name = name;//初始化必须起名字8    }9
10    public String getName() {
11        return this.name;
12    }
13
14    public void login(ChatRoom chatRoom) {//用户登陆
15        chatRoom.connect(this);//调用聊天室连接方法
16        this.chatRoom = chatRoom;//注入聊天室引用
17    }
18
19    public void talk(String msg) {//用户发言
20        chatRoom.sendMsg(this, msg);//给聊天室发消息
21    }
22
23    public void listen(User fromWhom, String msg) {//且听风吟
24        System.out.print("【"+this.name+"的对话框】");
25        System.out.println(fromWhom.getName() + " 说: " + msg);
26    }
27  }

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

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

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

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

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

还记得之前讲到的组合模式中的树型结构吧,它主要描述的是子节点与父节点的关系。

而中介模式更像是网络拓扑中的星型结构,它描述了众节点与中心点的关系。

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

JAVA设计模式什么鬼(中介)——作者:凸凹里歐相关推荐

  1. JAVA设计模式什么鬼(备忘录)——作者:凸凹里歐

    备忘录,备份曾经发生过的历史记录,以防忘记,之后便可以轻松回溯过往.想必我们曾经都干过很多蠢事导致糟糕的结果,当后悔莫及的时候已经是覆水难收了,只可惜这世界上没有后悔药,事后我们能做的只能去弥补过失, ...

  2. JAVA设计模式什么鬼(策略)——作者:凸凹里歐

    策略,Strategy,古时也称"计",为了达成某个目标的方案,目标不同,方案也随之更改.例如特工执行任务时总要准备好几套方案以应对突如其来的变化,A计划实施过程中情况突变导致预案 ...

  3. JAVA设计模式什么鬼(状态)——作者:凸凹里歐

    状态State,指某事物所处的状况或形态,比如水的三态,零下会变成固态冰,常温会是液态水,100℃会蒸发成气态的水蒸气. 在这个地球生态系统中,水的总量并不会增加,也不会减少,只是随着温度的变化其分子 ...

  4. JAVA设计模式什么鬼(代理)——作者:凸凹里歐

    代理,代表打理,以他人的名义代表委托人打理其本职工作之外或不所能及的事务,达成合作关系并更高效地促成事务完成的目的.例如明星经纪人,他们并没有像明星一样会唱歌.跳舞或演戏,而是替明星打理一些无暇顾及的 ...

  5. JAVA设计模式什么鬼(初探)——作者:凸凹里歐

    有物混成,先天地生.寂兮寥兮,独立而不改,周行而不殆,可以为天地母.吾不知其名,字之曰道,强为之名曰大.大曰逝,逝曰远,远曰反. 道是什么?道可道,非常道.道不明,说不尽的才算是道,它是自然法则的终极 ...

  6. JAVA设计模式什么鬼(适配器)——作者:凸凹里歐

    我们这个世界,充满着千奇百怪的对象,更有趣的是对象与对象间是存在着互动,沟通,这样世界才变得美妙.那到底是怎样互动呢?靠什么才能互动呢?是的,接口.比如你和朋友一起喝茶聊天,我们暂且不管声带,耳膜这些 ...

  7. JAVA设计模式什么鬼(装饰)——作者:凸凹里歐

    装饰,在某物件基础上加以修饰,装点,使得原本的朴素变得华丽,达到化腐朽为神奇的效果.比如我们从开发商买来的毛坯房,必然要进行室内装潢这么一项工程,什么简约风啊,北欧风啊,地中海,美式中式等等,当然萝卜 ...

  8. JAVA设计模式什么鬼(模板方法)——作者:凸凹里歐

    面向对象,是对事物属性与行为的封装,方法,指的就是行为.模板方法,显而易见是说某个方法充当了模板的作用,其充分利用了抽象类虚实结合的特性,虚部抽象预留,实部固定延续,以达到将某种固有行为延续至子类的目 ...

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

    开门见山,门,建筑物的入口,面,脸也.门面(Facade),通常指店铺的门头外表部分,当然一定要临街才是好的商铺,在人流量大的地方营造更好的视觉冲击,这样会有更多等等机会暴露给潜在顾客,否则只能是靠& ...

最新文章

  1. 如何在 Ubuntu Linux 16.04上安装开源的 Discourse 论坛
  2. 在eclipse中使用Lombok
  3. 百度贴吧——因百度账号策略调整导致长时间未登录的账号(最后登录在2017年6月1日以前)网页端无法登陆、移动端异常解决方案
  4. 994. 腐烂的橘子
  5. typescript 使用_如何使用TypeScript轻松修改Minecraft
  6. Unity3D-光照系统
  7. 基于套接字SOCKET的及时聊天
  8. 【朋友圈精选】web前端招聘面试的10个小分享
  9. 基于JAVA+Servlet+JSP+MYSQL的客户充值缴费管理系统
  10. JAVA 基础 / 第八课:面向对象 / JAVA类的方法与实例方法
  11. c语言编写比赛评分程序,比赛评分系统c语言课程设计.doc
  12. php max file uploads,php上传多文件max_file_uploads限制问题
  13. python分割PDF
  14. mysql sumif函数的使用方法_用sumif函数如何求平均值
  15. 仙武:开局神级召唤!(二)
  16. 编写吃c语言程序步骤,自己做的一个C语言小游戏——吃金子
  17. N、XR、XD、DR”各代表什么意思
  18. 天空卫士客户案例 | 网易数据安全篇
  19. 【老生谈算法】matlab实现全相位校准算法——全相位校准算法
  20. 谷歌的两面,威胁背后的苦战

热门文章

  1. MICCAI 2022:使用自适应条形采样和双分支 Transformer 的 DA-Net
  2. BQ25703 评估板测试
  3. 【微信小程序】Python 脚本跳一跳高分技巧
  4. Centos7离线安装gcc4.8
  5. QRCode使用(生成二维码)
  6. html视频文件转换成视频,Amazing Video to HTML5 Converter(视频到HTML5转换器) V1.7.0 官方版...
  7. 相册排版软件:Pixellu SmartAlbums 2 mac版
  8. 好用的mac软件下载网站
  9. Arduino使用红外避障传感器
  10. 四元组类,定义了四元组类的各种方法