目录
Mediator 中介者模式
目录
[TOC]
1. 概述
1.1. 设计模式定义
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
1.2. 自我理解
这个模式就是要让各个系统之间彻底解耦,不要互相强耦合在一起,互相调用过多,调用关系过于混乱。互相调用的时候通过一个中间的组件来解耦。
在实际的企业开发中,不是这么玩儿的,很少有见到说封装一个所谓的中介者,去让各个模块之间解耦,思考这个模式的本质,让各个模块之间解耦合
最最常见的一个方式,就是系统与系统之间,不是走直接的接口调用,而是基于MQ来解耦。录入过模块A要调用模块B和模块C,模块A发送一条消息到MQ里面去,模块B和模块C去消费这条消息,读到消息之后,知道模块A要调用自己,所以就执行对应的逻辑即可。常见于系统与系统之间的调用,可以基于MQ消息,异步执行的方式来调用,不需要同步调用和执行。
1.3. 中介者的组成
抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
1.4. 为什么要用中介者模式
比如下面的例子,聊天系统中的用户,互相依赖,相互关联,他们之间的关系会呈现为复杂的网状结构,这是过度耦合的架构,即不利于类的附庸,也不稳定。新增一个用户,所有用户都会受到影响。
如果引入中介者模式,那么用户的结构将变成星形结构,任何一个类的变动,只会影响类的本身,以及中介者。这样就减少了系统的耦合。
2. UML
3. Example
现在我们实现一款聊天工具,实现私聊以及群聊功能。
3.1. 不用设计模式的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
public class WithoutMediatorPatternDemo { public static void main(String[] args) { QQUser zhangsan = new QQUser("123", "zhangsan"); QQUser lisi = new QQUser("456", "lisi"); QQUser wangwu = new QQUser("789", "wangwu"); // 私聊 zhangsan.sendMessage("你好!", lisi); lisi.sendMessage("王五你好,我是张三介绍的李四!",wangwu); System.out.println("=======================群发========================="); // 群发 wangwu.sendMessage("大家好!", zhangsan); wangwu.sendMessage("大家好!", lisi); } public static class QQUser{ private String number; private String name; QQUser(String qqNumber, String name){ this.number = qqNumber; this.name = name; } public void getMessage(String msg, QQUser user){ System.out.println(user.toString()+"\t向\t"+this.toString()+"\t发来一条消息,消息内容为:【"+msg+"】"); } public void sendMessage(String msg, QQUser user){ user.getMessage(msg, this); } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "QQUser{" + "number='" + number + '\'' + ", name='" + name + '\'' + '}'; } } } |
3.2. Mediator设计模式的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
public class MediatorPatternDemo { public static void main(String[] args) { ChatRoom qq = new QQChatRoom(); User userA = new UserA(); User userB = new UserB(); User userC = new UserC(); qq.join(userA); qq.join(userB); qq.join(userC); qq.sendMessage(userA, userB, "你好!"); System.out.println("------------------------------------------"); qq.sendMessage(userB, userC, "在干嘛?"); System.out.println("------------------------------------------"); qq.sendGroupMessage(userA, "全体集合!"); } public interface User { void showMessage(String msg); } public static class UserA implements User { public void showMessage(String msg) { System.out.println("User=[A], copy message=[" + msg + "]"); } } public static class UserB implements User { public void showMessage(String msg) { System.out.println("User=[B], copy message=[" + msg + "]"); } } public static class UserC implements User { public void showMessage(String msg) { System.out.println("User=[C], copy message=[" + msg + "]"); } } public interface ChatRoom { void sendMessage(User from, User to, String msg); void join(User user); void sendGroupMessage(User from, String msg); } public static class QQChatRoom implements ChatRoom { private Set<User> users = new HashSet<User>(); public void sendMessage(User from, User to, String msg) { from.showMessage("发送"+msg+"成功"); to.showMessage("接收"+msg+"成功"); } public void join(User user) { users.add(user); } public void sendGroupMessage(User from, String msg) { if(!users.contains(from)){ users.add(from); } from.showMessage("发送"+msg+"成功"); for(User user : users){ user.showMessage("接收"+msg+"成功"); } } } } |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/mediator-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。