Java设计模式之中介者模式的实现方式

 更新时间:2023年04月26日 11:36:53   作者:.番茄炒蛋  
Java中介者模式是一种行为型设计模式,它通过一个中介者对象来协调多个对象之间的交互,降低对象之间的耦合度,提高系统的可维护性和可扩展性。本文将介绍该设计模式的原理、使用场景和实现方法

介绍

Java中介者模式(Mediator Pattern)是一种行为设计模式,它可以降低多个对象之间的耦合性,通过一个中介者对象来协调这些对象的交互.

在中介者模式中,多个对象之间的交互不是直接进行的,而是通过一个中介者对象来进行的.这个中介者对象封装了对象之间的交互逻辑,每个对象只需要与中介者对象进行通信,而不需要与其他对象直接进行通信.这种模式可以有效的减少代码的复杂度和维护成本,提高系统的可扩展性和可维护性.

在Java中, 中介者模式可以通过一个接口或抽象类来定义中介者对象,该中介者对象可以定义一些方法来处理对象之间的通信.同时,需要实现一些具体的对象类,这些对象类需要持有中介者对象,并且需要实现一些方法来与中介者对象进行通信.通过这种方式,可以实现对象之间的解耦,提高代码的可读性和可维护性.

实现

抽象中介者

public abstract class Mediator {
    public abstract void send(String message, Colleague colleague);
}

具体中介者

public class ConcreteMediator extends Mediator{
    private ConcreteColleague1 concreteColleague1;
    private ConcreteColleague2 concreteColleague2;
    public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
        this.concreteColleague1 = concreteColleague1;
    }
    public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
        this.concreteColleague2 = concreteColleague2;
    }
    @Override
    public void send(String message, Colleague colleague) {
        if (colleague == concreteColleague1){
            concreteColleague2.receive(message);
        }else {
            concreteColleague1.receive(message);
        }
    }
}

抽象同事类

public abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
    /**
     * 发送消息
     *
     * @param message
     */
    public abstract void send(String message);
    /**
     * 消费消息
     * @param message
     */
    public abstract void receive(String message);
}

具体同事类

public class ConcreteColleague1 extends Colleague {
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }
    /**
     * 发送消息
     *
     * @param message
     */
    @Override
    public void send(String message) {
        mediator.send(message, this);
    }
    /**
     * 消费消息
     *
     * @param message
     */
    @Override
    public void receive(String message) {
        System.out.println("concreteColleague1收到消息:" + message);
    }
}
public class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }
    /**
     * 发送消息
     *
     * @param message
     */
    @Override
    public void send(String message) {
        mediator.send(message, this);
    }
    /**
     * 消费消息
     *
     * @param message
     */
    @Override
    public void receive(String message) {
        System.out.println("concreteColleague2收到消息:" + message);
    }
}

测试

public class Demo {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
        mediator.setConcreteColleague1(concreteColleague1);
        mediator.setConcreteColleague2(concreteColleague2);
        concreteColleague1.send("Hello concreteColleague2");
        concreteColleague2.send("Hello concreteColleague1");
    }
}

在上面代码中,抽象中介者Mediator定义了同事类之间通信的接口,具体中介者类ConcreteMediator实现了这个接口,并持有同事类列表.抽象同事类Colleague定义了同事类的通信接口,具体同事类ConcreteColleague1和ConcreteColleague2分别实现了这个接口,实现了具体的通信逻辑.在测试代码中,我们创建了一个中介者对象,然后创建了两个同事对象并将他们加入到中介者对象的同事列表中,最后测试了它们之间的通信.

总结

优点:

  • 降低了对象之间的耦合度,是的它们更加容易被独立地修改,测试和维护.
  • 通过集中管理和协调对象之间的交互,可以更加灵活地扩展和修改系统,而不会对其他部分造成影响
  • 可以使得代码更加清晰易懂,因为所有对象之间的交互都被集中在中介者对象中进行处理.

缺点:

  • 中介者对象需要处理多个对象之间的交互,因此其复杂度可能较高,需要仔细设计和实现.
  • 如果设计不当,中介者对象可能会成为系统的瓶颈,降低系统的性能和响应速度.

应用场景:

  • 当多个对象之间存在复杂的交互关系,且彼此之间的耦合度较高时,可以考虑使用中介者模式进行重构.
  • 当系统中存在大量的对象,而且它们之间的交互关系错综复杂时,可以考虑使用中介者模式进行简化和优化.
  • 当需要再不影响其他部分的情况下扩展和修改系统时,可以使用中介者模式来实现系统的灵活性和可扩展性.

到此这篇关于Java设计模式之中介者模式的实现方式的文章就介绍到这了,更多相关Java中介者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中Spring对事务的支持详解

    Java中Spring对事务的支持详解

    这篇文章主要介绍了Java中Spring对事务的支持详解,Spring对事务的支持有两种方式,一是自己编写事务,精确控制事务的边界,二是采用声明事务的方式,使用AOP来完成,需要的朋友可以参考下
    2023-07-07
  • MyBatis Log 插件无法显示SQL语句的原因解析

    MyBatis Log 插件无法显示SQL语句的原因解析

    MyBatis Log是IDEA一款下载量非常高的插件,该插件可以对控制台打印的日志进行解析,然后将对应的SQL语句整理并拼接好对应的参数,非常方便。这篇文章给大家介绍MyBatis Log 插件无法显示SQL语句的原因,感兴趣的朋友跟随小编一起看看吧
    2020-09-09
  • 浅谈Spring Security 对于静态资源的拦截与放行

    浅谈Spring Security 对于静态资源的拦截与放行

    这篇文章主要介绍了浅谈Spring Security 对于静态资源的拦截与放行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java LeetCode普通字符串模拟题解示例

    java LeetCode普通字符串模拟题解示例

    这篇文章主要为大家介绍了java LeetCode普通字符串模拟题解示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring Boot高可用限流三种实现解决方案

    Spring Boot高可用限流三种实现解决方案

    限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,本文就介绍了Spring Boot高可用限流三种实现解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Java Web 登录页面的实现代码实例

    Java Web 登录页面的实现代码实例

    这篇文章主要介绍了Java Web 登录页面的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • java 中String.equals和==的比较

    java 中String.equals和==的比较

    这篇文章主要介绍了java 中String.equals和==的比较的相关资料,需要的朋友可以参考下
    2017-08-08
  • 解决MyBatis中为类配置别名,列名与属性名不对应的问题

    解决MyBatis中为类配置别名,列名与属性名不对应的问题

    这篇文章主要介绍了解决MyBatis中为类配置别名,列名与属性名不对应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SpringBoot 如何使用 JWT 保护 Rest Api 接口

    SpringBoot 如何使用 JWT 保护 Rest Api&nbs

    使用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的 API 增加授权保护是非常必要的,现在我们来看如何利用JWT技术为API 增加授权保护,保证只有获得授权的用户才能够访问 API,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • Java实现本地文件批量重命名的示例代码

    Java实现本地文件批量重命名的示例代码

    本文主要介绍了Java实现本地文件批量重命名的示例代码,主要步骤为获取指定目录下的所有文件,对每个文件进行修改,将修改后的文件名赋给该文件,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10

最新评论