简化对象间交互:Java中介者模式实践

中介者模式 (Mediator Pattern) 是一种在软件设计中用来降低多个对象或组件间的耦合度的设计模式,它属于行为型设计模式。在 Java 中,中介者模式的核心思想是定义一个中介对象,让原本相互依赖的对象之间通过中介者进行通信,而不是直接相互引用。这样可以使各个对象之间的关系更加清晰,更容易维护和扩展。

在现实生活中,中介者模式的例子随处可见,下面是一些直观易懂的生活场景:

  • 房屋租赁中介: 在房屋租赁市场中,房东和租客通常不直接交流,而是通过房地产中介来进行房源信息发布、看房、签约等一系列活动。这里的房地产中介就扮演了中介者的角色,它负责协调房东和租客的需求和沟通,减少了双方直接交流的复杂性和风险。
  • 商业谈判中间人: 在商业交易或合同谈判中,买卖双方有时会聘请律师或专业顾问作为中间人。中间人在谈判过程中传达双方意见,帮助解决分歧,促进协议达成,降低了双方因直接协商可能产生的矛盾冲突。
  • 教育咨询机构: 当学生和学校之间需要建立联系时,教育咨询机构往往会作为一个中介,收集学生需求,推荐适合的学校和课程,协助完成申请流程等。这样的中介角色能够有效连接供需双方,提高信息匹配效率。

以上都是现实生活中的中介者模式应用场景,它们的核心都是引入了一个独立的角色,来管理和协调多方面的交互关系,从而使得各参与方可以专注于自身的核心功能,同时保持系统运行的有序和高效。

代码示例

这里我们将创建了一个中介者对象mediator,以及两个同事对象colleagueA和colleagueB。我们将这两个同事对象添加到中介者的同事列表中,然后分别调用它们的send方法发送消息。由于中介者的存在,这些消息会被转发给其他同事,从而实现了对象之间的通信解耦。

抽象同事类Colleague:

java 复制代码
public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

两个具体同事类ConcreteColleagueA和ConcreteColleagueB,继承自Colleague:

java 复制代码
public class ConcreteColleagueA extends Colleague {
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        System.out.println("ConcreteColleagueA sends message: " + message);
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleagueA receives message: " + message);
    }
}

public class ConcreteColleagueB extends Colleague {
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        System.out.println("ConcreteColleagueB sends message: " + message);
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleagueB receives message: " + message);
    }
}

具体中介者类ConcreteMediator,在send方法中调用对象的接收方法以通知其他同事:

java 复制代码
public interface Mediator {
    void send(String message, Colleague colleague);
}


public class ConcreteMediator implements Mediator {
    private List<Colleague> colleagues;

    public ConcreteMediator() {
        colleagues = new ArrayList<>();
    }

    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void send(String message, Colleague originator) {
        for (Colleague colleague : colleagues) {
            if (colleague != originator) {
                colleague.receive(message);
            }
        }
    }
}

运行函数:

java 复制代码
public class Main {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();

        Colleague colleagueA = new ConcreteColleagueA(mediator);
        Colleague colleagueB = new ConcreteColleagueB(mediator);

        mediator.addColleague(colleagueA);
        mediator.addColleague(colleagueB);

        colleagueA.send("Hello from A");
        colleagueB.send("Hello from B");
    }
}

中介者模式适合应用场景

  1. 当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。该模式让你将对象间的所有关系抽取成为一个单独的类, 以使对于特定组件的修改工作独立于其他组件。

  2. 当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。应用中介者模式后, 每个组件不再知晓其他组件的情况。 尽管这些组件无法直接交流, 但它们仍可通过中介者对象进行间接交流。 如果你希望在不同应用中复用一个组件, 则需要为其提供一个新的中介者类。

  3. 如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。由于所有组件间关系都被包含在中介者中, 因此你无需修改组件就能方便地新建中介者类以定义新的组件合作方式。

中介者模式优点

  1. 降低复杂度:通过引入中介者,一对多交互转化为一对一交互,减少了对象间的直接交互次数,从而使程序的复杂程度显著下降。
  2. 解耦:中介者模式通过集中控制交互逻辑,使各对象之间不必彼此了解,降低了类之间的耦合性。这提高了代码的可维护性和可扩展性,因为一个对象的改变不太可能影响到其他对象。
  3. 简化通信:系统中的复杂性被分解到中介者中,使得各个模块职责更加分明,易于管理和维护。

中介者模式缺点

  1. 增加系统的复杂性:需要在系统中额外引入中介者对象,这可能会增加系统结构的复杂性。
  2. 中介者可能变得复杂难维护:当同事类数量增多时,中介者的职责可能随之膨胀,从而变得复杂且难以维护。
相关推荐
JH30736 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_7 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble7 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟7 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖7 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707539 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.9 小时前
Day06——权限认证-项目集成
java
瑶山9 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy9 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法