概述
- 定义 : 定义一个封装一组对象如何交互的对象
- 通过使对象明确的相互引用来促进松散耦合, 并允许独立的改变它们的交互
- 类型 : 行为型
适用场景
- 系统中对象之间存在复杂的引用关系, 产生的相互依赖关系结构混乱且难以理解
- 交互的公共行为, 如果需要改变行为则可以增加新的中介者类
优点
- 将一对多转化成了一对一, 降低了程序复杂度
- 类之间解耦
缺点
- 中介者过多, 导致系统复杂
模式角色
-
Mediator(中介者) : 中介者定义一个接口用于与各同事(Colleague)对象通信。
-
ConcreteMediator(具体中介者) :
- 具体中介者通过协调各同事对象实现协作行为。
- 了解并维护它的各个同事。
-
Colleague class(同事类) :
- 每一个同事类都知道它的中介者对象。
- 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信
代码实现
场景
群聊场景, 每个用户将消息发送到群中, 在群中展示, 不具体发送到个人, 类与中介者模式对应关系如下:
- Mediator接口 : 对应中介者模式中的Mediator(中介者)角色
- GroupMediator : 对应中介者模式中的ConcreteMediator(具体中介者)角色
- User : 对应中介者模式中的Colleague class(同事类)角色
UML类图
代码
Mediator接口 :
/**
* Mediator(中介者)
*
* @author 七夜雪
* @create 2018-11-24 18:56
*/
public interface Mediator {
public void sendMsg(User user, String msg);
}
GroupMediator :
/**
* 群聊类-中介者模式中的ConcreteMediator(具体中介者)角色
*
* @author 七夜雪
* @create 2018-11-24 18:57
*/
public class GroupMediator implements Mediator {
@Override
public void sendMsg(User user, String msg) {
System.out.println(user.getName() + " : " + msg);
}
}
User :
/**
* 用户类-中介者模式中的Colleague class
*
* @author 七夜雪
* @create 2018-11-24 18:56
*/
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
测试代码 :
/**
* 测试类
*
* @author 七夜雪
* @create 2018-11-24 18:59
*/
public class Client {
public static void main(String[] args) {
Mediator mediator = new GroupMediator();
User user1 = new User("萧忆情");
User user2 = new User("舒靖容");
mediator.sendMsg(user1, "听雪楼中听雪落");
mediator.sendMsg(user2, "彼岸花开彼岸零");
}
}
测试结果 :
萧忆情 : 听雪楼中听雪落
舒靖容 : 彼岸花开彼岸零