行为型模式[中介者模式]
中介者模式又称为调解者模式或调停者模式。用一个中介对象封装一系列对象交互,中介者使各对象不需要显示地相互作用,从而使其解耦松散,而且可以独立地改变它们之间的相互。属于行为型模式
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象间的作用。保证这些作用可以彼此独立的变化。其核心思想是通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发
中介者模式的应用场景
在现实生活中,中介者的存在是不可缺少的,如果没有了中介者,我们就不能与远方的朋友进行交流了,各个同事对象将会相互进行引用,如果每个对象都与对象进行交互时,将会产生多对多无用的关联关系。每个对象之间过渡耦合,这样的既不利于信息的复用也不利于扩展。如果引用了中介者模式,那么对象之间的关系将变成星型结构。
简单的说就是多个类相互耦合,形成网状结构,则考虑使用中介者模式进行优化。
1、系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
2、相互的公共行为,如果需要改变行为则可以增加新的中介者类。
中介者模式通用的UML类图:
从图中可以看到中介者模式主要包含2个部分:
1、具体中介者【Broker】:定义统一的接口,用于获取学生角色之间通信,从具体的学生对象接收消息,向具体学生对象发生消息,协调每个学生间的协作。
2、抽象学生类【Student】:每一个学生对象均需要依赖中介者角色,与其他学生间通信时,交由中介者进行转发协作。
// 中介者+享元对象
public class Broker {
private final Map<String, Student> brokerMap = new ConcurrentHashMap<>();
public void sendMessage(String UserName,String message) {
Student student = brokerMap.get(UserName);
student.receiveMessage(message);
}
public void put(String studentName, Student student) {
brokerMap.put(studentName, student);
}
}
// 抽象学生
public abstract class Student {
protected Broker broker;
public void setStudent(Broker broker, Student student) {
this.broker = broker;
this.broker.put(this.getClass().getSimpleName(), student);
}
public abstract void sendMessage(String UserName, String message);
public void receiveMessage(String message) {
System.out.println(String.format("%s:receiveMessage", this.getClass().getSimpleName())+"消息:"+message);
}
}
// 具体学生实现
public class StudentA extends Student {
public StudentA(Broker broker) {
super.setStudent(broker,this);
}
@Override
public void sendMessage(String UserName,String message) {
System.out.println(String.format("%s:sendMessage", this.getClass().getSimpleName())+"消息:"+message);
super.broker.sendMessage(UserName,message);
}
}
// 具体学生实现
public class StudentB extends Student {
public StudentB(Broker broker) {
super.setStudent(broker,this);
}
@Override
public void sendMessage(String UserName,String message) {
System.out.println(String.format("%s:sendMessage", this.getClass().getSimpleName())+"发送给:"+UserName+"消息:"+message);
super.broker.sendMessage(UserName,message);
}
@Override
public void receiveMessage(String message) {
super.receiveMessage(message);
System.out.println("已读已读,不想回复");
}
}
// 具体学生实现
public class StudentC extends Student {
public StudentC(Broker broker) {
super.setStudent(broker, this);
}
@Override
public void sendMessage(String UserName, String message) {
System.out.println(String.format("%s:sendMessage", this.getClass().getSimpleName()) + "消息:" + message);
super.broker.sendMessage(UserName, message);
}
}
public class Test {
public static void main(String[] args) {
Broker broker = new Broker();
Student studenta = new StudentA(broker);
Student studentb = new StudentB(broker);
Student studentc = new StudentC(broker);
studenta.sendMessage("StudentB","上号上号");
System.out.println("========================");
studentb.sendMessage("StudentC","你来不来,来就上号");
System.out.println("========================");
studentc.sendMessage("StudentA","你来不来,来就上号");
}
}
中介者模式的优缺点
优点:减少类间依赖,将多对多依赖转换成一对多关系,减低类间耦合。类间各司其职,符合迪米特法则。
缺点:中介者模式将原本多个对象直接的相互依赖变成了中介者和多个学生类的依赖关系,当学生类越多时,中介者就会越臃肿,变得复杂且难以维护。