当前位置: 首页 > news >正文

Java设计模式(九)—— 中介者模式

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

适合中介者模式的情景如下:

  • 许多对象以复杂的方式交互,所导致的依赖关系使系统难以维护
  • 一个对象引用其他很多对象,导致难以复用该对象

一、中介者模式

        中介者模式解决问题的思路很简单,就是通过引入一个中介对象,让其他对象只与中介对象交互,而中介对象知道如何和其他所有对象的交互,这样对象之间的交互关系就没有了,从而实现了对象之间的解耦。

具体实例:

以房屋中介功能为例,实现的功能是:

  • 租客发布租房信息到房屋中介,房屋中介将收到的信息发布给所有的房东
  • 房东发布信息到房屋中介,房屋中介将收到的信息发布给租客

(1)租客

receive() 方法用于租客接收来自中介者的信息;send() 方法用于租客向中介者发信息。

public class Renter {
    String account;//账号
    String name;
    Mediator me;//用户和中介者通信
    
    public void receive(String msg) {
        System.out.println(account + "\t" +name + "receive:");
        System.out.println("\t" +msg);
    }
    public void send(String msg) {
        me.send(this,msg);
    }

    public Renter(String account, String name, Mediator me) {
        this.account = account;
        this.name = name;
        this.me = me;
    }

    public String getAccount() {
        return account;
    }

    public String getName() {
        return name;
    }
}

(2)房东

public class Saler {
    String account;
    String name;
    Mediator me;

    public void receive(String msg) {
        System.out.println(account + "\t" +name + "receive:");
        System.out.println("\t" +msg);
    }
    public void send(String msg) {
        me.send(this,msg);
    }
    
    public Saler(String account, String name, Mediator me) {
        this.account = account;
        this.name = name;
        this.me = me;
    }

    public String getAccount() {
        return account;
    }

    public String getName() {
        return name;
    }
}

(3)中介

因为中介必须知道所有用户的信息,所以定义了租客和房东的map集合,send() 方法用于接收某一方的信息,并且向另一方的所有对象广播出去。

Set<String> set = m2.keySet();//拿到map中的key存入set集合中
public class Mediator {
    Map<String,Renter> m = new HashMap<>();
    Map<String,Saler> m2 = new HashMap<>();
    
    void addRenter(Renter r) {
        m.put(r.getAccount(),r);
    }
    void addSaler(Saler s) {
        m2.put(s.getAccount(),s);
    }
    
    public void send(Renter renter, String msg) {
        System.out.println("来自租客"+renter.account+"-"+renter.getName());
        System.out.println("\t"+msg);
        //拿到房东的set集合
        Set<String> set = m2.keySet();
        Iterator<String> iterable = set.iterator();
        //遍历房东set集合
        while (iterable.hasNext()) {
            String key = iterable.next(); //拿到房东的账号
            Saler sa = m2.get(key);//根据账号key拿到房东信息
            //调用房东的receive方法,将租客的信息发送给房东
            sa.receive(renter.getAccount()+"-"+renter.getName()+"-"+msg);
        }
    }
    public void send(Saler saler, String msg) {
        System.out.println("来自租客"+saler.account+"-"+saler.getName());
        System.out.println("\t"+msg);
        //拿到房东的set集合
        Set<String> set = m.keySet();
        Iterator<String> iterable = set.iterator();
        //遍历房东set集合
        while (iterable.hasNext()) {
            String key = iterable.next(); //拿到租客的账号
            Renter sa = m.get(key);//根据账号key拿到租客信息
            //调用租客的receive方法,将房东的信息发送给租客
            sa.receive(saler.getAccount()+"-"+saler.getName()+"-"+msg);
        }
    }
}

(4)测试类

public class Test {
    public static void main(String[] args) {
        Mediator mediator = new Mediator();
        //租客
        Renter renter1 = new Renter("1001","zhangyin",mediator);
        Renter renter2 = new Renter("1002","minmin",mediator);
        Renter renter3 = new Renter("1003","sisi",mediator);
        mediator.addRenter(renter1);
        mediator.addRenter(renter2);
        mediator.addRenter(renter3);
        //租户
        Saler saler1 = new Saler("2001","dongzi",mediator);
        Saler saler2 = new Saler("2002","haozi",mediator);
        Saler saler3 = new Saler("2003","xiangzi",mediator);
        mediator.addSaler(saler1);
        mediator.addSaler(saler2);
        mediator.addSaler(saler3);

        renter2.send("Minmin要租房!");
        System.out.println("====================================");
        saler2.send("浩子有房要出租!");
    }

}

测试结果:

来自租客1002-minmin
	Minmin要租房!
2003	xiangzi receive:
	1002-minmin-Minmin要租房!
2002	haozi receive:
	1002-minmin-Minmin要租房!
2001	dongzi receive:
	1002-minmin-Minmin要租房!
====================================
来自租客2002-haozi
	浩子有房要出租!
1003	sisi  receive:
	2002-haozi-浩子有房要出租!
1002	minmin  receive:
	2002-haozi-浩子有房要出租!
1001	zhangyin  receive:
	2002-haozi-浩子有房要出租!

相关文章:

  • HTML5支持的视频文件格式和音频文件格式有哪些?
  • 【图神经网络】10分钟掌握图神经网络及其经典模型
  • 【Axure教程】鼠标滚动上下翻页效果
  • Qt 自定义日志类总结
  • 算法学习|动态规划 LeetCode 416. 分割等和子集
  • Scala泛型(泛型方法,泛型类,泛型特质,上下界,协变、逆变、非变)
  • C/C++字符串
  • 基于Python GDAL库实现图像的几何校正详细教程
  • SpringBoot接参注解与校验失败后的三种异常
  • 【C语言学习】变量和数据类型
  • 【Vue2从入门到精通】详解Vue.js的15种常用指令及其使用场景
  • SpringMVC(8)——SSM整合
  • 【内网安全】横向移动Exchange服务有账户CVE漏洞无账户口令爆破
  • 10、Django开发总结:Django缓存Cache应用场景、设置以及高级使用技巧
  • 【黑客技术】LOIC —— 低轨道离子炮工具使用
  • Android Studio:GIT提交项目到远程仓库
  • android图片蒙层
  • Consul Config 使用Git做版本控制的实现
  • CSS居中完全指南——构建CSS居中决策树
  • jquery ajax学习笔记
  • Laravel Mix运行时关于es2015报错解决方案
  • Median of Two Sorted Arrays
  • Mithril.js 入门介绍
  • Python十分钟制作属于你自己的个性logo
  • Rancher如何对接Ceph-RBD块存储
  • 阿里云前端周刊 - 第 26 期
  • 分享几个不错的工具
  • 浮现式设计
  • 机器学习中为什么要做归一化normalization
  • 每天一个设计模式之命令模式
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信小程序设置上一页数据
  • 在weex里面使用chart图表
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​用户画像从0到100的构建思路
  • ###C语言程序设计-----C语言学习(3)#
  • #NOIP 2014#Day.2 T3 解方程
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (附源码)计算机毕业设计大学生兼职系统
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Mysql的优化设置
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [AR]Vumark(下一代条形码)
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BZOJ 1040] 骑士
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体