定义
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用性
- 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
结构
参与者
- Mediator(中介者)
- 中介者定义一个接口用于与各同事(Colleague)对象通信。
- ConcreteMediator(具体中介者)
- 具体中介者通过协调各同事对象实现协作行为。
- 了解并维护它的各个同事。
- Colleague(同事类)
- 每一个同事类都知道它的中介者对象。
- 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
效果
- 减少了子类生成
- 它将各Colleague解耦
- 它简化了对象协议
- 它对对象如何协作进行了抽象
- 它使控制集中化
相关模式
- Facade与中介者的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即Facade对象对这个子系统类提出请求,但反之则不行。Mediator提供了各Colleague对象不支持或不能支持的协作行为,而且协议是多向的。
- Colleague可使用Observer模式与Mediator通信。
示例
abstract class UnitedNations{
public abstract void declare(String message,Country collegue);
}
abstract class Country{
protected UnitedNations mediator;
public Country(UnitedNations mediator){
this.mediator=mediator;
}
}
class USA extends Country{
public USA(UnitedNations mediator) {
super(mediator);
}
public void declare(String message){
mediator.declare(message, this);
}
public void getMessage(String message){
System.out.println("美国接收到:"+message);
}
}
class Iraq extends Country{
public Iraq(UnitedNations mediator) {
super(mediator);
}
public void declare(String message){
mediator.declare(message, this);
}
public void getMessage(String message){
System.out.println("伊拉克接收到:"+message);
}
}
//同事类越多,中介者的逻辑就越复杂
class UnitedNationsSecurityCouncil extends UnitedNations{
private USA usa;
private Iraq iraq;
public USA getUsa() {
return usa;
}
public void setUsa(USA usa) {
this.usa = usa;
}
public Iraq getIraq() {
return iraq;
}
public void setIraq(Iraq iraq) {
this.iraq = iraq;
}
@Override
public void declare(String message, Country collegue) {
//处理通信
if(collegue==usa){
iraq.getMessage(message);
}else{
usa.getMessage(message);
}
}
}
public class Mediator {
//适用于多个对象紧密耦合的情况下(网状结构)->星型结构
public static void main(String[] args) {
UnitedNationsSecurityCouncil unsc=
new UnitedNationsSecurityCouncil();
USA usa=new USA(unsc);
Iraq iraq=new Iraq(unsc);
//同时类必须有中介者,但是中介者却可以只有部分同时类
unsc.setUsa(usa);
unsc.setIraq(iraq);
usa.declare("不准研制核武器!");
iraq.declare("我们不怕国家被侵略!");
}
}