Java设计模式-中介者模式Mediator
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
介绍
- 中介者模式Mediator Pattern用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用从而使其耦合松散而且可以独立地改变它们之间的交互。
- 中介者模式属于行为型模式使代码易于维护。
- 比如 MVC 模式CController 控制器是 MModel 模型和 VView 视图的中介者在前后端交互时起到了中间人的作用。
原理类图
- Mediator 就是抽象中介者,定义了同事对象到中介者对象的接口
- Colleague 是抽象同事类
- ConcreteMediator 具体的中介者对象, 实现抽象方法, 他需要知道所有的具体的同事类,即以一个集合来管理
HashMap,并接受某个同事对象消息完成相应的任务 - ConcreteColleague 具体的同事类会有很多, 每个同事只知道自己的行为而不了解其他同事类的行为(方法)但 是他们都依赖中介者对象
实战案例
- 首先我们将创建Mediator接口该接口将定义具体中介者接口
public interface ChatMediator {
public void sendMessage(String msg, User user);
void addUser(User user);
}
- 用户可以发送和接收消息所以我们可以有用户界面或抽象类。我正在创建User作为如下抽象类。User.java
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator med, String name){
this.mediator=med;
this.name=name;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
- 现在我们将创建一个具体的中介类它将包含组中的用户列表并为用户之间的通信提供逻辑
public class ChatMediatorImpl implements ChatMediator {
private List<User> users;
public ChatMediatorImpl(){
this.users=new ArrayList<>();
}
@Override
public void addUser(User user){
this.users.add(user);
}
@Override
public void sendMessage(String msg, User user) {
for(User u : this.users){
//message should not be received by the user sending it
if(u != user){
u.receive(msg);
}
}
}
}
- 现在我们可以创建客户端系统使用的具体User类
public class UserImpl extends User {
public UserImpl(ChatMediator med, String name) {
super(med, name);
}
@Override
public void send(String msg){
System.out.println(this.name+": Sending Message="+msg);
mediator.sendMessage(msg, this);
}
@Override
public void receive(String msg) {
System.out.println(this.name+": Received Message:"+msg);
}
}
- 让我们用一个简单的程序来测试我们的聊天应用程序我们将在其中创建调解器并将用户添加到组中其中一个用户将发送消息
public class ChatClient {
public static void main(String[] args) {
ChatMediator mediator = new ChatMediatorImpl();
User user1 = new UserImpl(mediator, "Pankaj");
User user2 = new UserImpl(mediator, "Lisa");
User user3 = new UserImpl(mediator, "Saurabh");
User user4 = new UserImpl(mediator, "David");
mediator.addUser(user1);
mediator.addUser(user2);
mediator.addUser(user3);
mediator.addUser(user4);
user1.send("Hi All");
}
}
- 输出
JDK中的案例
-
java.util.Timer类scheduleXXX方法
-
java并发执行器execute方法。
-
java.lang.reflect.Method invoke方法。
注意事项
- 多个类相互耦合会形成网状结构, 使用中介者模式将网状结构分离为星型结构进行解耦
- 减少类间依赖降低了耦合符合迪米特原则
- 中介者承担了较多的责任一旦中介者出现了问题整个系统就会受到影响
- 如果设计不当中介者对象本身变得过于复杂这点在实际使用时要特别注意