设计模式之中介者模式

简介: 设计模式之中介者模式

中介者模式

示例代码git地址:https://gitee.com/zyxscuec/Design-pattern.git

文章目录

(1)概念

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

图片来源:https://blog.csdn.net/ZixiangLi/article/details/86228684

(2)适用场景

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。

2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项:不应当在职责混乱的时候使用。

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用:多个类相互耦合,形成了网状结构。

如何解决:将上述网状结构分离为星型结构。

关键代码:对象 Colleague 之间的通信封装到一个类中单独处理。

(3)代码示例

我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类 ChatRoomUserUser 对象使用 ChatRoom 方法来分享他们的消息。

MediatorPatternDemo,我们的演示类使用 User 对象来显示他们之间的通信。

创建中介类。

package com.alibaba.design.mediatorpattern;
import java.util.Date;
/**
 * @author zhouyanxiang
 * @create 2020-08-2020/8/1-21:50
 */
public class ChatRoom {
    public static void showMessage(User user, String message){
        System.out.println(new Date().toString()
                + " [" + user.getName() +"] : " + message);
    }
}

创建 user 类。

package com.alibaba.design.mediatorpattern;
/**
 * @author zhouyanxiang
 * @create 2020-08-2020/8/1-21:51
 */
public class User {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public User(String name){
        this.name  = name;
    }
    public void sendMessage(String message){
        ChatRoom.showMessage(this,message);
    }
}

使用 User 对象来显示他们之间的通信。

package com.alibaba.design.mediatorpattern;
/**
 * @author zhouyanxiang
 * @create 2020-08-2020/8/1-21:53
 */
public class MediatorPatternDemo {
    public static void main(String[] args) {
        User robert = new User("Robert");
        User john = new User("John");
        robert.sendMessage("Hi! John!");
        john.sendMessage("Hello! Robert!");
    }
}

(4)该模式在源码中的体现

在java.util.Timer中

timer是一个中介者,它持有新创建到TimerTask的引用,timer负责执行TimerTask的定时任务。不同的TimerTask只知道自己的定时任务,而不清楚其他的TimerTask任务,但是都认识Timer这个中间者对象

在线程方面也用到了这个模式

java.util.concurrent.Executor#execute(Runnable command)

java.util.concurrent.ExecutorService#submit(Runnable command)

exec是一个中介者,它持有Runnable的引用,exec是一个异步任务执行者,它负责执行Runnable任务。

Executor exec = Executors.newFixedThreadPool(100);
    exec.execute(new Runnable() {
      @Override
      public void run() {
        System.out.println("nice to meet u");
      }
    });
    exec.execute(new Runnable() {
      @Override
      public void run() {
        System.out.println("nice to meet u too");
      }
    });

(5)中介者模式的优缺点

  • 优点:
    1、降低了类的复杂度,将一对多转化成了一对一。
    2、各个类之间的解耦。
    3、符合迪米特原则。
  • 缺点:
    中介者会庞大,变得复杂难以维护。


相关文章
|
12月前
|
设计模式 前端开发
设计模式21 - 中介者模式【【Mediator Pattern】
设计模式21 - 中介者模式【【Mediator Pattern】
45 0
|
12月前
|
设计模式 调度
行为型设计模式09-中介者模式
行为型设计模式09-中介者模式
35 0
|
7天前
|
设计模式 Java
Java设计模式-中介者模式(20)
Java设计模式-中介者模式(20)
|
2月前
|
设计模式 前端开发 Java
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
文章详细介绍了中介者模式(Mediator Pattern),这是一种对象行为型模式,用于封装一系列对象的交互,降低系统耦合度,并简化对象之间的交互关系。通过案例分析、结构图、时序图和代码示例,文章展示了中介者模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
|
3月前
|
设计模式 JavaScript
js设计模式【详解】—— 中介者模式
js设计模式【详解】—— 中介者模式
57 5
|
4月前
|
设计模式
中介者模式-大话设计模式
中介者模式-大话设计模式
|
4月前
|
设计模式 Java 程序员
Java设计模式之中介者模式详解
Java设计模式之中介者模式详解
|
4月前
|
设计模式
设计模式之中介者模式
设计模式之中介者模式
|
4月前
|
设计模式 前端开发 NoSQL
设计模式第八讲:观察者模式和中介者模式详解
 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
195 0
|
5月前
|
设计模式 Go
[设计模式 Go实现] 行为型~中介者模式
[设计模式 Go实现] 行为型~中介者模式