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

作者:.番茄炒蛋 时间:2022-08-10 23:43:06 

介绍

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");
   }
}

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

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

  • 当多个对象之间存在复杂的交互关系,且彼此之间的耦合度较高时,可以考虑使用中介者模式进行重构.

  • 当系统中存在大量的对象,而且它们之间的交互关系错综复杂时,可以考虑使用中介者模式进行简化和优化.

  • 当需要再不影响其他部分的情况下扩展和修改系统时,可以使用中介者模式来实现系统的灵活性和可扩展性.

来源:https://blog.csdn.net/qq_43135259/article/details/129447393

标签:Java,设计模式,中介者模式
0
投稿

猜你喜欢

  • Java发送post方法详解

    2023-10-28 03:55:00
  • C#实现char字符数组与字符串相互转换的方法

    2022-01-18 05:28:52
  • 详解使用Spring的BeanPostProcessor优雅的实现工厂模式

    2023-01-14 02:15:53
  • Java中将File转化为MultipartFile的操作

    2021-07-05 21:25:32
  • Android实现旋转动画

    2022-05-15 15:26:15
  • 详解springmvc常用5种注解

    2023-03-27 15:15:43
  • Android录制声音文件(音频)并播放

    2023-07-04 06:31:19
  • java微信支付接入流程详解

    2023-07-28 18:37:46
  • Android高仿京东垂直循环滚动新闻栏

    2022-01-05 12:15:41
  • Java最长公共子序列示例源码

    2023-08-20 13:25:37
  • Kotlin Flow数据流的3种使用场景详解

    2021-06-03 09:06:18
  • android短信管理器SmsManager实例详解

    2021-09-03 18:17:18
  • java.exe和javaw.exe的区别及使用方法

    2022-08-27 10:03:39
  • 在C#中创建和读取XML文件的实现方法

    2021-12-20 08:10:45
  • Java double转BigDecimal的注意事项说明

    2022-12-13 14:44:38
  • 一篇带你解析入门LongAdder源码

    2023-11-28 20:17:52
  • C# .NET中Socket简单实用框架的使用教程

    2023-09-16 07:59:19
  • mybatis-plus QueryWrapper 添加limit方式

    2022-12-09 02:08:11
  • java线程池的四种创建方式详细分析

    2022-10-20 22:32:41
  • Kotlin中的handler如何避免内存泄漏详解

    2023-10-18 22:02:40
  • asp之家 软件编程 m.aspxhome.com