什么是调停者模式?
调停者模式是一种旨在降低一系列对象之间耦合关系的设计模式。在一个系统中,对象与对象之间是不可避免发生各种通信,共同合作完成特定的功能。我们把这些对象成为同事对象(Collegue)。通过将同事对象之间的交互逻辑提取、封装在调停者(Mediator)对象里,消除了这些对象之间明显的相互引用,让它们只通过一个调停者进行合作,从而降低了对象之间的耦合度,增加对象的可复用性。
为什么要使用调停者模式?
在不使用调停者模式的代码中,同事对象之间的调用关系可能是一个复杂的网状结构,如下图所示
上图所示的系统就是一个过度耦合的系统,这种系统如果要加入一个新的对象,就要考虑新对象与所有已有对象之间的交互作用,使这个系统的扩展变得特别困难。那么我们把每个对象之间的交互集中在一个中间类里,让所有的对象只跟这一个中间类交互,就把这种网状结构转换成了星状结构。
在这种结构的系统中,我们新加一个对象的时候,只需要考虑这个对象怎么跟调停者对象交互即可,大大提高了系统的可扩展性。
我们用一个简易版的斗地主案例,来说明一下在不使用调停者模式下,对象之间交互的复杂性。
我们都知道,斗地主的规则里,如果地主获胜了,自己加分,两个农民扣分。而如果一个农民胜了,那么自己和另一个农民加分,地主扣分。
// 地主类
public class Landlord {
private int score; // 现有分数
public Landlord() {
this.score = 0;
}
public void win(Farmer[] farmers) {
this.score += 20;
for(Farmer farmer : farmers) {
farmer.lose();
}
}
public void lose() {
this.score -= 20;
}
}
// 农民类
public class Farmer {
private int score;
public Farmer() {
this.score = 0;
}
public void win(Farmer a