模式定义
用一个中介者对象来封装一系列的对象交互。这样就使各个对象之间不需要显示的相互引用,达到降低耦合的目的,并且可以独立的改变它们之间的交互
使用范围
- 一组已经定义好的对象以复杂的方式进行通信,产生相互依赖的关系结构且难以理解时;
- 一个对象引用很多其他对象,并直接与这些对象通信时;
- 想定制一个分布在多个类中的行为,又不想生成太多的子类(如根据某种行为定义一个接口,让想拥有该行为的类实现该接口)
模式参与者
Mediator
接口,用于抽象3中所说的行为
MediatorImpl
实现了Mediator,同时持有彼此需要相互通信的对象的实例
AbstractMember
需要相互通信的对象的抽象类(用于抽象各具体对象的通用属性)
ExactMember
具体的对象实现
代码实现
要模拟的场景描述:
两个知道彼此姓名单不认识的员工他们需要交流,但他们属于不同的部门,但Hr对他们的个人信息都十分了解,所以就有Hr安排他们彼此认识
抽象出员工都需要的抽象行为
1
2
3public abstract class Mediator {
public abstract void sayHi(String message, Employee employee);
}
抽象行为的具体实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29public class ConcreteMediator extends Mediator {
EmployeeA employeeA;
EmployeeB employeeB;
public EmployeeA getEmployeeA() {
return employeeA;
}
public void setEmployeeA(EmployeeA employeeA) {
this.employeeA = employeeA;
}
public EmployeeB getEmployeeB() {
return employeeB;
}
public void setEmployeeB(EmployeeB employeeB) {
this.employeeB = employeeB;
}
public void sayHi(String message, Employee employee) {
if (employee == employeeA) {
employeeB.sayHi(message);
} else {
employeeA.sayHi(message);
}
}
}
员工的抽象
1
2
3
4
5
6
7
8
9public class Employee {
protected String name;
protected Mediator mediator;
public Employee(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
1 |
|
安排一个会议室,让他们彼此打招呼(即定义客户端,运行代码测试)
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
EmployeeA employeeA = new EmployeeA("张三", mediator);
EmployeeB employeeB = new EmployeeB("李四", mediator);
mediator.setEmployeeA(employeeA);
mediator.setEmployeeB(employeeB);
employeeA.sayHi("我有事要和李四说。");
employeeB.sayHi("我下午有时间,下午商量。");
}
}例子可能不当,请见谅!
从上面的例子可以看到,作为中介着的ConcreteMediator持有需要交流的A、B员工实例(即可直接访问需要彼此交互的对象),A、B员工的构造方法中又接受了一个中介者队形作为参数,这样A、B对象就可以调用Mediator里面的方法进行通信。
总结
中介者模式,虽然降低了不同对象之间相处引用而引起的耦合,但同样会是中介者里面的逻辑处理变的复杂起来。而且示例中的对象方法和属性都相同,在对象更复杂的情况下,中介者的使用难度更大