20230430 25. 中介者模式 - 联合国
介绍
中介者模式又叫调停者模式
尽管将一个系统分割成许多对象通常可以增加其可复用性,但是对象间相互连接的激增又会降低其可复用性
大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。
通过中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,每个具体对象不再通过直接的联系与另一个对象发生相互作用,而是通过‘中介者’对象与另一个对象发生相互作用。中介者对象的设计,使得系统的结构不会因为新对象的引入造成大量的修改工作。
中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了‘多对多’交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
Mediator 的出现减少了各个 Colleague 的耦合,使得可以独立地改变和复用各个 Colleague 类和 Mediator 。其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
由于 ConcreteMediator 控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个 ConcreteMediator 都复杂。
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
代码示例
Mediator
/**
* 联合国
*/
public abstract class UnitedNations {
public abstract void declare(String message, Country country);
}
Mediator 实现类
/**
* 联合国安理会
*/
@Data
public class UnitedNationsSecurityCouncil extends UnitedNations {
private USA usa;
private Iraq iraq;
@Override
public void declare(String message, Country country) {
if (country == usa) {
this.iraq.getMessage(message);
}
if (country == iraq) {
this.usa.getMessage(message);
}
}
}
Colleague
Colleague 实现类
/**
* USA
*/
public class USA extends Country {
public USA(UnitedNations unitedNations) {
super(unitedNations);
}
}
/**
* 伊拉克
*/
public class Iraq extends Country {
public Iraq(UnitedNations unitedNations) {
super(unitedNations);
}
}
客户端
public class Test {
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("我们没有核武器,也不怕侵略");
}
}