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

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-浩子有房要出租!


http://www.kler.cn/a/5259.html

相关文章:

  • 学习记录:C/C++ 中的续行符
  • OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)
  • el-table表格合并某一列
  • Visio 画阀门 符号 : 电动阀的画法
  • 什么是cline?
  • Mysql - 多表连接和连接类型
  • 从NLP视角看电视剧《狂飙》,会有什么发现?
  • 15. 三数之和(Java)
  • 软件架构class-5-ORMapping思想
  • 发现一个白嫖GPT4.0的方法!真的是完胜3.5!
  • 二叉树练习题(数据结构系列10)
  • 【linu】ARM安装vscode服务器,本地vscode远程服务器开发
  • Redis面试题 (2023最新版)
  • 嵌入式系统概括
  • unity3d:asset store上C#代码热重载插件,不需要重运行,重新加载更新后函数
  • 字符串(二)-- LC[17] 电话号码的字母组合
  • Vision Pro 自己写的一些自定义工具(c#)
  • 深入探究PyTorch:理解PyTorch的基础知识(一)
  • 大数据学完好就业么
  • Typora 修改表格宽度
  • js时间前五分钟 + utc转本地时间
  • PUSCH接收端处理流程学习
  • 如何检测程序的合理性
  • 10个华为华为交换机常用的Python脚本,网络工程师收藏!
  • GPT-4零失误通关大厂模拟面试,offer拿到手软?与AGI首次接触
  • 学习HM微博项目第1天