定义
用一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。
类比
- 房屋中介, 多个买家, 多个卖家
类图
示例
伪代码
IMeidator {
List<ISeller> sellers;
public void addSeller(ISeller seller) {
sellers.add(seller);
}
void notify(Stirng str);
}
Mediator extends IMeidator {
public void notify(String str) {
for seller : sellers
seller.message(str);
}
}
ISeller {
message(String);
}
SellerA implements ISeller{
message(String msg){
System.out.print("SellerA receive " + msg);
}
}
SellerB implements ISeller{
message(String msg){
System.out.print("SellerB receive " + msg);
}
}
IBuy {
IMeidator mediator;
void setMediator(Imediator mediator){
this.mediator = mediator;
}
void buy();
}
BuyerA implements IBuy {
buy() {
mediator.notify("A want buy")
}
}
BuyerB implements IBuy {
buy() {
mediator.notify("B want buy")
}
}
优点
符合迪米特原则,将原有的一对多的依赖变成了一对一的依赖,降低类间的耦合。
缺点
中介者会变得庞大且复杂,原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系,同事类越多,中介者的逻辑就越复杂。
使用场景
中介者模式很容易实现呢,但是也容易误用,不要着急使用,先要思考你的设计是否合理。
当对象之间的交互变多时,为了防止一个类会涉及修改其他类的行为,可以使用中介者模式,将系统从网状结构变为以中介者为中心的星型结构。
代理模式、外观模式和中介者模式对比
当我们学完中介者模式是不是会觉得和此前讲过的代理模式和外观模式有些类似呢?现在我们一一来将它们进行对比。
代理模式和中介者模式
代理模式是结构型设计模式,它有很多种类型,主要是在访问对象时引入一定程度的间接性,由于有间接性,就可以附加多种的用途,比如进行权限控制。中介者模式则是为了减少对象之间的相互耦合。虽然网上有很多代理模式和中介者模式的对比,但是在我看来这两者实际上并没有可比性,只是看起来有些类似罢了。
外观模式和中介者模式
外观模式主要是以封装和隔离为主要任务,中介者则是调停同事类之间的关系,因此,中介者具有部分业务的逻辑控制。他们之间的主要区别为:
- 外观模式的子系统如果脱离外观模式还是可以运行的,而中介者模式增加了业务逻辑,同事类不能脱离中介者而独自存在。
- 外观模式中,子系统是不知道外观类的存在的,而中介者模式中,每个同事类都知道中介者。
- 外观模式将子系统的逻辑隐藏,用户不知道子系统的存在,而中介者模式中,用户知道同事类的存在。