中介者模式定义
中介者模式通过一个中介对象封装一系列的对象交互,中介者是各个对象不需要显式地相互作用,从而使他们松散耦合。
中介者模式使用场景
多个类相互耦合,形成了网状结构,则考虑使用中介者模式进行优化:
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系混乱,难以理解,类似Dubbo的服务治理的概念,从服务之间相互调用的网状依赖关系,通过dubbo变成一个星形结构,每个服务都与注册中心打交道。
- 交互的公共行为,如果需要 改变行为,则可以增加新的中介者类
中介者模式结构
中介者模式包含四个角色:
抽象中介者Meditor : 定义统一的接口,用于各个同事角色之间通信
具体中介者ConcreteMeditor:从具体的同时对象接收消息,向具体同事对象发出命令,协调各同事间的协作
抽象同事类Colleague:每一个同事对象均需要依赖中介者角色,与其他同事间通信时,交给中介者进行转发
具体同事类ConcreteColleague: 负责实现自发行为(selfMethod),转发依赖方法(depmethod)交给中介者协调
中介者模式简单例子
假设要设计一个聊天室,用户向聊天室发送消息,聊天室向所有用户显示消息,实际上就是用户发消息与聊天室显示的过程:
创建User类
package com.lchtest.pattern.meditor.chatroom;
import lombok.Data;
@Data
public class User {
private String name;
// 用户通过聊天室发送消息
//实际上是发送消息到聊天室,聊天室代为转发给其他用户
private ChatRoom chatRoom;
public User(String name, ChatRoom chatRoom) {
this.chatRoom = chatRoom;
this.name = name;
}
public void sendMsg(String msg) {
this.chatRoom.showMsg(this, msg);
}
}
创建中介者ChatRoom
package com.lchtest.pattern.meditor.chatroom;
public class ChatRoom {
public void showMsg(User user, String msg) {
System.out.println("[" + user.getName() + "] : " + msg);
}
}
测试类
package com.lchtest.pattern.meditor.chatroom;
public class Test {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoom();
User mic = new User("mic",chatRoom);
User jack = new User("jack",chatRoom);
mic.sendMsg("Hi,I am mic");
jack.sendMsg("Hello,this is jack.");
}
}