中介者模式是将多个对象之间通信的网状结构转化为星状结构,从而避免多个对象之间的相互耦合,是一种行为型的设计模式。中介者模式的思路就是加入一个中介者对象,所有对象与对象之间的通信,均通过中介者来进行,所以每个对象不再依赖其他的对象。
实现:中介者模式中一般存在多个同事类或者对象,中介者类。
- 同事类或者对象:通常一个对象的状态变化或者行为需要对其他同事产生影响。每个同事对象依赖中介者,通过中介者传达影响。
- 中介者:被同事类依赖,负责进行同事之间消息的通知。
适用场景:一般存在网状结构的场景,都可以通过中介者模式来进行优化。比如课堂上每个同学的课堂发言或者小组讨论,比如微信的群组的实现等,都是网状的模型。
案例 背景比如模拟一个班级上同学之间的谈话。班上有三个女生A、B和C,有三个男生D、E和F。女生A想说一些话,只想让女生知道。男生D则想说一些话,让所有的人都可以听到。这是一个很明显的网状通信的问题。
实现同事类
public class Student {
private String name;
private String sex;
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
Mediator.add(this);
}
public String getSex() {
return sex;
}
public String getName() {
return name;
}
public void sendMessageToAll(String message)
{
Mediator.sendMessageToAll(this, message);
}
public void sendMessageToSameSex(String message)
{
Mediator.sendMessageToSameSex(this, message);
}
public void receiveMessage(String message)
{
System.out.println(name + "收到了消息。" + message);
}
}
中介者
import java.util.ArrayList;
import java.util.List;
public class Mediator {
private static List<Student> maleStudents = new ArrayList<Student>();
private static List<Student> femaleStudents = new ArrayList<Student>();
public static void add(Student student)
{
if ("male".equals(student.getSex()))
{
maleStudents.add(student);
}
else
{
femaleStudents.add(student);
}
}
public static void sendMessageToAll(Student student, String message)
{
for (Student stu : maleStudents)
{
if (student.getName().equals(stu.getName()))
continue;
stu.receiveMessage(student.getName() + ":" + message);
}
for (Student stu : femaleStudents)
{
if (student.getName().equals(stu.getName()))
continue;
stu.receiveMessage(student.getName() + ":" + message);
}
}
public static void sendMessageToSameSex(Student student, String message)
{
List<Student> tempList = "male".equals(student.getSex()) ? maleStudents : femaleStudents;
for (Student stu : tempList)
{
if (student.getName().equals(stu.getName()))
continue;
stu.receiveMessage(student.getName() + ":" + message);
}
}
}
验证程序
public class Test {
public static void main(String[] args){
Student femaleA = new Student("小丽","female");
Student femaleB = new Student("小红","female");
Student femaleC = new Student("小美","female");
Student femaleD = new Student("小刚","male");
Student femaleE = new Student("小明","male");
Student femaleF = new Student("小达","male");
femaleA.sendMessageToAll("大家好,我叫小丽");
femaleA.sendMessageToSameSex("舍友们,今天咱们去哪里吃饭?");
femaleD.sendMessageToSameSex("走,去躺厕所。");
}
}
输出结果
总结小刚收到了消息。小丽:大家好,我叫小丽
小明收到了消息。小丽:大家好,我叫小丽
小达收到了消息。小丽:大家好,我叫小丽
小红收到了消息。小丽:大家好,我叫小丽
小美收到了消息。小丽:大家好,我叫小丽
小红收到了消息。小丽:舍友们,今天咱们去哪里吃饭?
小美收到了消息。小丽:舍友们,今天咱们去哪里吃饭?
小明收到了消息。小刚:走,去躺厕所。
小达收到了消息。小刚:走,去躺厕所。
中介者模式通过加入中介者角色,使得所有对象之间的消息通知都通过中介者进行,从而将网状模型转变为星状模型。
优点:解除同事对象之间的耦合关系
缺点:中介者可能会比较庞大和复杂。