设计模式-中介者模式_中介者模式 spring-程序员宅基地

技术标签: 中介者模式  设计模式  

中介者模式

模式对比

最典型的莫过于房产中介了,熟悉两端,两端交互,两端收费。

从设计模式中找出相似的模式并不容易,而且差异不小

  • 代理模式
  • 装饰器模式

具体行为都不用详细对比,因为它明确的就只有单向调用。

其他设计模式也有回调这种形态,但是功能上没有更多的转发管理

更相似应该算是桥接,但是调用链其实还是单向的。

中介者自身的特质也能够直白的体现出来:传声筒。

但是传达过程中的其他操作和管理,这也是我们能够利用的空间。

代码示例

class Wechat {
    
    Map<String, User> users = new HashMap<>();

    public void addUser(String name, User user){
    
        users.put(name, user);
    }

    public void sendMessage(String from, String to, String message){
    
        User receiver = users.get(to);
        receiver.recvMessage(from, message);
    }

}

class User {
    
    Wechat wechat;
    String name;
    public void sendMessage(String to, String message){
    
        wechat.sendMessage(name, to, message);
    }

    public void recvMessage(String from, String message){
    
        // doSomething
    }

}

中介优势

  • 缓冲

不论是代理还是装饰器,如果你知道他们的好处,那这双端预留的空间的遍历也能够有所想象。

  • 透明

因为交互不再隐蔽,结合观察者模式,在这缓冲区间内可以进行更多的操作。

  • 闭环

因为要负责两端的交流,其实内部就必须实现两端的对接,这对于整个环节的管理是十分方便的。

  • 串联

因为双端模式一致,不一不停的交替串联,完成多级中介。

  • 复用

比如发送、接收消息,将部分信息进行泛化,能够抽取出最本质的内核,达到更高的复用。

降低代码的复杂度和管理成本。

中介应用

  • DUBBO

实现服务间的相互调用,服务间不用单独进行对接;同时额外各种配置、限流。

  • 路由器

单独针对接收和发送,完成多链路信息的转发,而不用每个点单独相连。

这也是所谓网络层区别于链路层的原因,网络提高了传输线路的利用率。

  • 商店

不论是什么商店,甚至是超市、食堂,即使物流公司等都可以带入其中。

每个个体不用自己制造,自己对接,复用相同的功能;内聚、更好维护、管理。

其实不必要从底层找,反过来想,对于基于组合的形态,其实都有中介者模式的身影

  • 苹果制造:全球工厂组装
  • 淘宝网店:多个门面同一厂家
  • 神雕侠侣:多个租客一个房东
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wait_for_eva/article/details/120170743

智能推荐

安装、验证allure提示 JAVA_HOME is set to an invalid directory_dos验证allure提示无java环境_qq_41902720的博客-程序员宅基地

安装、验证allure提示 JAVA_HOME is set to an invalid directory如题,在cmd下验证allure是否安装成功,提示JAVA_HOME is set to an invalid directory,通过java -version; javac 验证Java环境并没有问题,通过网上查找,最后确定环境变量JAVA_HOME配置 路径带有分号解决办法:删除当前配置路径在新的文本框中重新配置Java home路径(一定要注意编辑路径时看不到分号,保存完毕后分号就出来了,_dos验证allure提示无java环境

软件密码模块安全要求_密码模块分为几个等级_zhrmghg119的博客-程序员宅基地

@软件密码模块安全要求欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计..._密码模块分为几个等级

Unity实现RawImage图片显示视频 、灵活配置控制视频播放_牛奶咖啡13的博客-程序员宅基地

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using UnityEngine.Video;namespace SimpleUIFrame{ public class Ctrl_MovingCtrl : MonoBehaviour ...

android博学谷实验报告,《Android项目实战-博学谷》我的模块_Silly Sylvie的博客-程序员宅基地

我的模块界面思路由于此界面只是主界面中的一部分,所以无需创建一个新的 Activity ,只需要在 layout 目录下新建一个布局即可,同理导入图片至 drawable 目录下具体代码如下:main_view_myinfo.xmlandroid:layout_width="match_parent"android:layout_height="match_parent"android:backg..._博学谷android项目实训报告

centos路由查看命令_Linux中查看路由表的命令是什么?_侯乔的博客-程序员宅基地

linux查看网络路由跳转traceroute www.baidu.com查看路由表route -n//netstat -rnroute命令用于显示和操作IP路由表。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是 为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Interne..._linux查看路由命令

多表连接问题_宽表连接9张表怎么处理_zhangpan_soft的博客-程序员宅基地

前端时间有同行找到我让我给他看一段sql,说要优化,呢是个多表连接的sql,我看了下,就简单对sql语句进行了优化,对此说下多表连接优化思路:按照正常的逻辑假如,ABC三个表有关系,一般都是select ... from a left join b ... left join c ... where ...一般都是这样的结构,其实,我们这样的sql稍微换一下顺序效率就有明显提升我们分析上面_宽表连接9张表怎么处理

随便推点

ubuntu16.04安装kvm虚拟机_ubuntu16.04中安装kvm_君君要上天的博客-程序员宅基地

之前一直用vmware workstation,但这玩意儿收费,且无法透传GPU,最终改用KVM。安装sudo apt install qemu-kvm qemu virt-manager libvirt-bin bridge-utils 网桥配置如果用nat模式,那就不需要配置网桥了。sudo vim /etc/NetworkManager/NetworkManager.confmanaged=false改为managed=true修改网卡配置:sudo vim /etc/networ_ubuntu16.04中安装kvm

使用batch insert解决MySQL的insert吞吐量问题_Xu_Renata的博客-程序员宅基地

最近使用了一个非常简单易用的方法解决了业务上的一个insert吞吐量的问题,在此总结一下。 首先我们明确一下,insert吞吐量其实并不是指的IPS(insert per second),而是指的RPS(effect rows per second)。其次我们再说一下batch insert,其实顾名思义,就是批量插入。这种优化思想是很基本的,MySQL中最出名的应用就是g

一篇解决springMVC前后端参数传递问题_springmvc 前台传到后台多层数据无法传递_>no problem<的博客-程序员宅基地

本文对于springMVC或springBoot使用过程中,前后端如何参数的问题进行了详细的介绍,并解释了为什么要这样做,包括但不限于键值对格式、json格式、rest风格的URL如何传参等问题,一起来看看吧!_springmvc 前台传到后台多层数据无法传递

C#的GC机制,委托机制与Unity内存泄露_unity gc和c# gc区别_抗痘洁面泥的博客-程序员宅基地

最近项目测试然后发现有很多闪退的情况,用工具去检测了下确定是程序代码导致内存泄露的,然后就去找了发现了代码中存在下图中所示的写法(这只是个例子并不是实际情况)开始的时候想当然了,认为按照引用计数这种原理,People这个对象创建之后,如果不手动把Hand中People对象置为NULL,然后再把People这个对象置为NULL是无法释放掉的,但是在我把这两个对象都置为null之后还是没有得到释放_unity gc和c# gc区别

Convirt中国开源项目_withtreasure的博客-程序员宅基地

Covirt中国社区志在为大家打造一个稳定、开源、持续更新、中文、符合国人使用习惯的虚拟化管理软件本,社区完全公益开放!convirt是基于 KVM,XEN开发的一套虚拟化产品。其特点是每一次对服务器的操作都是通过原生的linux命令模拟人工ssh登录来完成的,所以具有很好的稳定性,灵活性和可扩展性。后台系统基于python语言开发,使用python中轻量级的Turbogears框架使得整

android 1.0转1,(转)Android NDK编译Openssl-1.1.0f静态库_东方捕的博客-程序员宅基地

https://blog.csdn.net/ljttianqin/article/details/729918690 前言按照源代码C:\openssl-1.1.0f下的INSTALL文件中的编译指导,在Windows中用Cygwin模拟Linux环境顺利编译出libcrypt.a和libssl.a,然而在Android NDK项目中编译报错不通过,报错无法解析的符号,检查.a静态库链接是正确的,..._android 1.0转成1

推荐文章

热门文章

相关标签