中介者模式,又称为调停者模式,是一种行为型设计模式。其思想是:用一个中介者对象封装一系列的对象交互,使各对象不需要显示地相互作用,从而实现松耦合结构。
中介者模式涉及3个角色:
- 抽象中介者(Mediator):中介者对象的接口,用于实现各个同事类之间的通信。
- 具体中介者(Concrete Mediator):具体的中介者,实现抽象中介者中声明的方法。
- 同事(Colleague):如果一个对象会影响另一个对象,同时也会被另一个对象影响,那么这两个对象称为同事类。
一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一高过度耦合的结构。
(图片来源于网络)
而中介者的作用,就是将这种网状结构转化为星型结构。
(图片来源于网络)
结构图:
具体代码实现:
同事:
public abstract class Colleague {
protected int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public abstract void setNum(int num, Mediator mediator);
}
public class ColleagueA extends Colleague {
public ColleagueA() {
this.num = 10000;
}
@Override
public void setNum(int num, Mediator mediator) {
this.num = num;
mediator.affectB(num); // A的改变同时影响B
}
}
public class ColleagueB extends Colleague {
public ColleagueB() {
this.num = 100;
}
@Override
public void setNum(int num, Mediator mediator) {
this.num = num;
mediator.affectA(num); // B的改变同时影响A
}
}
中介者:
public interface Mediator {
void affectA(int num);
void affectB(int num);
}
public class ConcreteMediator implements Mediator {
private Colleague a = new ColleagueA();
private Colleague b = new ColleagueB();
public ConcreteMediator(Colleague a, Colleague b) {
this.a = a;
this.b = b;
}
@Override
public void affectA(int num) {
a.setNum(num * 100);
}
@Override
public void affectB(int num) {
b.setNum(num / 100);
}
}
客户:
public class Client {
public void method() {
Colleague a = new ColleagueA();
Colleague b = new ColleagueB();
Mediator mediator = new ConcreteMediator(a, b);
System.out.printf("a=%d b=%d\n", a.getNum(), b.getNum()); // 打印初始化之后a,b的值
a.setNum(11100, mediator); // 改变a的值
System.out.printf("a=%d b=%d\n", a.getNum(), b.getNum());
b.setNum(123, mediator); // 改变b的值
System.out.printf("a=%d b=%d\n", a.getNum(), b.getNum());
}
}
// 测试
class MediatorTest {
public static void main(String[] args) {
Client client = new Client();
client.method();
}
}
运行结果:
a=10000 b=100
a=11100 b=111
a=12300 b=123
中介者模式是一种比较重要的设计模式。例如,MVC框架就是一个常见的中介者模式的实现,MVC当中的C(控制器)就是M(模型)和V(视图)的中介者。
中介者模式同时也是一种比较容易被滥用的模式。适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式,将网状结构变为星状结构,使同事类之间的关系变的清晰一些。