中介者模式
对于存在着多对多的复杂调用关系的系统,中介者模式提供了一种解决这种复杂关系的处理方案。假设一个系统中有4个对象相互作用,其中一个对象发生了变化,其他3个对象都要执行某个方法:如果每个对象都关联3个对象,那么关联关系将比较复杂,并且难以维护。我们可以设置一个中介者类,关联所有对象,当一个对象发生变化时,由它对其他3个对象进行通知,化繁为简。
通过中介者类的中转作用,各个同事对象之间不需要进行显示关联,而是通过中介者类间接作用,实现了解耦,同时也方便对同事对象进行增减。另一方面,中介者和同事对象可以协定并统一调用方法,通过中介者类传递行为,使得同事对象之间的行为解耦。
定义
定义一个对象来封装一系列对象的交互。中介者模式使得各对象之间不需要显示的相互引用,从而使其解耦松散,而且用户可以独特的改变它们之间的交互
结构
- Mediator抽象中介者
- ConcreteMediator具体中介者
- Colleague抽象同事类
- ConcreteColleague具体同事类
实例
package mediator;
public abstract class Employee {
String name;
private Group group;
public Employee(String name) {
super();
this.name = name;
}
public void waring() {
System.out.println(this.name + "示警: 老大来了");
group.warning(this);
}
public abstract void changeStatus();
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
package mediator;
public class ConcreteEmployee extends Employee {
public ConcreteEmployee(String name) {
super(name);
}
@Override
public void changeStatus() {
System.out.println(this.name + "收起了手机");
}
}
package mediator;
public interface Group {
void add(Employee employee);
void warning(Employee employee);
}
package mediator;
import java.util.ArrayList;
import java.util.List;
public class WXGroup implements Group{
private List<Employee> eList;
public WXGroup() {
this.eList = new ArrayList<>();
}
@Override
public void add(Employee employee) {
this.eList.add(employee);
employee.setGroup(this);
}
@Override
public void warning(Employee employee) {
for (Employee e : eList) {
if (employee != e) {
e.changeStatus();
}
}
}
}
package mediator;
public class Test {
public static void main(String[] args) {
Employee e1 = new ConcreteEmployee("张三");
Employee e2 = new ConcreteEmployee("李四");
Employee e3 = new ConcreteEmployee("王五");
Employee e4 = new ConcreteEmployee("赵六");
Group g = new WXGroup();
g.add(e1);
g.add(e2);
g.add(e3);
g.add(e4);
e1.waring();
}
}
// 张三示警: 老大来了
// 李四收起了手机
// 王五收起了手机
// 赵六收起了手机
优缺点
- 结构上进行了解耦,使得多对多的复杂关系得到了简化,通过中介者类的存在使得结构的维护、增减新的同事对象变得更加容易
- 行为上进行了解耦,当一个对象发生了变化时,不需要显示调用其他所有对象,只要通知中介者,其他对象会得到相应的信息
- 因为中介者协调同事对象之间的调用关系,随着同事对象的增多和功能的复杂,中介者内部的代码也会变得十分繁琐,维护麻烦
适用场景
- 系统中对象之间存在着复杂的引用关系
- 当一个对象状态发生变化时会导致其他对象状态发生相应的改变