源碼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