定义
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
特点
集中相关对象之间复杂的沟通和控制方式。
使用场景
- 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
- 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
优缺点
(1) 优点
- 降低了类的复杂度,将一对多转化成了一对一。
- 各个类之间的解耦。
(2) 缺点
- 中介者会庞大,变得复杂难以维护。
模式结构
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(ChatPlatform)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(User)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(NormalUser)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
具体实现
中介者
/**
* 抽象中介者
*/
public abstract class Mediator {
//所有在聊天室里的人存这
List<User> userList = new ArrayList<>();
/**
* 群发
*/
abstract void sendToAll(String msg);
/**
* 给某个人发送消息
*/
abstract void senToPerson(String msg, String name);
/**
* 用户加入聊天室
*/
abstract void join(User user);
/**
* 用户离开聊天室
*/
abstract void leave(User user);
}
/**
* 具体中介者实现--聊天室平台
*/
public class ChatPlatform extends Mediator {
@Override
void sendToAll(String msg) {
for (User u : userList) {
u.accept(msg);
}
}
@Override
void senToPerson(String msg, String name) {
for (User u : userList) {
if (u.name.equals(name))
u.accept(msg);
}
}
@Override
void join(User user) {
userList.add(user);
}
@Override
void leave(User user) {
userList.remove(user);
}
}
同事类
/**
* 抽象同事
*/
public abstract class User {
protected Mediator mediator;
String name;
//在创建对象的时候就把他的中间者传入,他要发送都是通过这个中介者来做的。
public User(String name, Mediator mediator){
this.name = name;
this.mediator = mediator;
}
/**
* 给所有人发消息
*/
abstract void sendToAll(String msg);
/**
* 给某个人发送消息
*/
abstract void senToPerson(String msg, String name);
/**
* 接收消息
*/
abstract void accept(String msg);
/**
* 加入聊天室
*/
abstract void join();
/**
* 离开聊天室
*/
abstract void leave();
}
/**
* 具体同事
*/
public class NormalUser extends User {
public NormalUser(String name, Mediator mediator) {
super(name, mediator);
}
@Override
void sendToAll(String msg) {
mediator.sendToAll(msg);
}
@Override
void senToPerson(String msg, String name) {
mediator.senToPerson(msg, name);
}
@Override
void accept(String msg) {
System.out.println(this.name + "收到消息:" + msg);
}
@Override
void join() {
mediator.join(this);
}
@Override
void leave() {
mediator.leave(this);
}
}
具体使用
/**
* 中介者模式测试类
*/
public class App {
public static void main(String[] args) {
Mediator chatPlatform = new ChatPlatform();
User a = new NormalUser("A", chatPlatform);
User b = new NormalUser("B", chatPlatform);
User c = new NormalUser("C", chatPlatform);
a.join();
b.join();
c.join();
System.out.println("-----------------A群发送消息------------------");
a.sendToAll("A:大家听得到吗?");
System.out.println("-----------------A给B私发消息------------------");
a.senToPerson("A:B,我只想和你说", "B");
System.out.println("-----------------B给A私发消息------------------");
b.senToPerson("B:可以,请说", "A");
System.out.println("-----------------A离开聊天室------------------");
a.leave();
System.out.println("-----------------B群发送消息------------------");
b.sendToAll("B:A能听到吗");
}
}
实际应用
- MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
- 任务调度器
- All scheduleXXX() methods of java.util.Timer
- java.util.concurrent.Executor#execute()
- submit() and invokeXXX() methods of java.util.concurrent.ExecutorService
- scheduleXXX() methods of java.util.concurrent.ScheduledExecutorService