版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79741056
源码git地址 https://github.com/dlovetco/designMode
有时候类与类之间的关系虽然在设计初期是相互独立的,但是随着代码量的增加很容易在类之间建立起许许多多的关系。此时再去看类图会发现此时的类图已经变成网状结构,违反了我们之前讲过的迪米特法则。解决这个问题的一种可行的办法是把网状结构改成以一个管理类中心的星型结构。
问题提出
以国与国之间的关系为例。所有国家之间都有一个联合国来统一管理。联合国就相当于管理者。下面用代码来实现这一场景。
中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
package mediatormode;
public class MediatorMode {
public static void main(String[] args) {
//定义两个国家
Country usa = new USA();
Country china = new China();
//定义中介者
Union union = new Union();
//为国家和中介者之间建立起关系
usa.setUnion(union);
china.setUnion(union);
union.setChina(china);
union.setUsa(usa);
//国家之间对话
china.sendMessage("美国你好啊");
usa.sendMessage("好的好的,中国你也好啊");
}
}
/**
* 国家接口
*/
interface Country {
void setUnion(Mediator mediator);
void sendMessage(String message);
void getMessage(String message);
}
class USA implements Country {
private Mediator union;
@Override
public void setUnion(Mediator union) {
this.union = union;
}
@Override
public void sendMessage(String message) {
union.sendMessage(this, message);
}
@Override
public void getMessage(String message) {
System.out.println("usa接收到了消息,消息内容为:" + message);
}
}
class China implements Country {
private Mediator union;
@Override
public void setUnion(Mediator union) {
this.union = union;
}
@Override
public void sendMessage(String message) {
union.sendMessage(this, message);
}
@Override
public void getMessage(String message) {
System.out.println("china接收到了消息,消息内容为:" + message);
}
}
/**
* 中介者
*/
interface Mediator {
void sendMessage(Country country, String message);
}
/**
* 联合国
*/
class Union implements Mediator {
private Country china;
private Country usa;
public void setChina(Country china) {
this.china = china;
}
public void setUsa(Country usa) {
this.usa = usa;
}
@Override
public void sendMessage(Country country, String message) {
if (country == china) {
usa.getMessage(message);
} else if (country == usa) {
china.getMessage(message);
}
}
}
输出:
usa接收到了消息,消息内容为:美国你好啊
china接收到了消息,消息内容为:好的好的,中国你也好啊
中介者模式实现了类管理的集中化。在中介者模式中,就算是一个复杂的系统。一个类的修改或者扩展都不会影响其他的类,我们要做的只是修改中介者类。但是中介者模式也有一个比较致命的缺陷:
虽然中介者模式解除了类与类之间的高耦合,但是同时中介者类本身与其他类的耦合在增加。所以当中介类瘫痪了,那么整个系统就会报废。
plantuml
@startuml
interface Country{
{abstract}setUnion(Mediator mediator);
{abstract}sendMessage(String message);
{abstract}getMessage(String message);
}
Country <|.. China
Mediator <-- China
class China{
Mediator union
setUnion(Mediator mediator);
sendMessage(String message);
getMessage(String message);
}
Country <|.. USA
Mediator <-- USA
class USA{
Mediator union
setUnion(Mediator mediator);
sendMessage(String message);
getMessage(String message);
}
interface Mediator{
{abstract}sendMessage(Country country, String message)
}
Mediator <|.. Union
Country <-- Union
class Union{
Country china
Country usa
sendMessage(Country country, String message)
}
@enduml