中介者模式
示例代码git地址:https://gitee.com/zyxscuec/Design-pattern.git
文章目录
(1)概念
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
图片来源:https://blog.csdn.net/ZixiangLi/article/details/86228684
(2)适用场景
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项:不应当在职责混乱的时候使用。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
何时使用:多个类相互耦合,形成了网状结构。
如何解决:将上述网状结构分离为星型结构。
关键代码:对象 Colleague 之间的通信封装到一个类中单独处理。
(3)代码示例
我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类 ChatRoom 和 User。User 对象使用 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、符合迪米特原则。 - 缺点:
中介者会庞大,变得复杂难以维护。