中介者模式 定義 用一個中介對象來封裝一系列的對象交互。中介使各對象之間不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的交互。 UML圖 舉個慄子 “聯合國”就是世界上各個國家的一個“中介”,許多事情都不是國家之間直接交互,而是通過“安理會”等組織進行協商、投票等過程。 Talk ...
中介者模式
定義
用一個中介對象來封裝一系列的對象交互。中介使各對象之間不需要顯示的相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的交互。
UML圖
舉個慄子
“聯合國”就是世界上各個國家的一個“中介”,許多事情都不是國家之間直接交互,而是通過“安理會”等組織進行協商、投票等過程。
Talk is cheap, show me the code
(屁話少說,放碼過來)
/**
* 聯合國機構
* Created by callmeDevil on 2019/12/15.
*/
public abstract class UnitedNations {
// 聲明
public abstract void declare(String message, Country colleague);
}
/**
* 國家(相當於Colleague類)
* Created by callmeDevil on 2019/12/15.
*/
public abstract class Country {
protected UnitedNations mediator;
public Country(UnitedNations mediator){
this.mediator = mediator;
}
}
/**
* 美國(相當於 ConcreteColleague1 類)
* Created by callmeDevil on 2019/12/15.
*/
public 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);
}
}
/**
* 伊拉克(相當於 ConcreteColleague2 類)
* Created by callmeDevil on 2019/12/15.
*/
public 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);
}
}
/**
* 聯合國安全理事會
* Created by callmeDevil on 2019/12/15.
*/
public class UnitedNationsSecurityCouncil extends UnitedNations{
// 美國
private USA colleague1;
// 伊拉克
private Iraq colleague2;
// 省略 get set
@Override
public void declare(String message, Country colleague) {
// 重寫聲明方法,實現了兩個對象之間的通信
if (colleague == colleague1) {
colleague2.getMessage(message);
} else {
colleague1.getMessage(message);
}
}
}
public class Test {
public static void main(String[] args) {
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
USA c1 = new USA(UNSC);
Iraq c2 = new Iraq(UNSC);
UNSC.setColleague1(c1);
UNSC.setColleague2(c2);
c1.declare("不准研製核武器,否則要發動戰爭!");
c2.declare("我們沒有核武器,也不怕侵略!");
}
}
運行結果
伊拉克獲得對方信息:不准研製核武器,否則要發動戰爭!
美國獲得對方信息:我們沒有核武器,也不怕侵略!
總結
優點
- Mediator的出現減少了各個Colleague的耦合,使得可以獨立的改變和復用各個Colleague類和Mediator
- 由於把對象如何協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個對象中,這樣關註的對象就從對象各自本身的行為轉移到它們之間的交互上來,也就是站在一個更巨集觀的角度去看待系統
缺點
- 中介者模式很容易在系統中應用,也容易誤用。當系統出現了‘多對多’交互複雜的對象群時,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理的
- 由於ConcreteMediator控制了集中化,於是就把交互複雜性變為中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜
常用情景
- 一組對象以定義良好但是複雜的方式進行交互通信的場合
- 需要定製一個分佈在多個類中的行為,而又不想生成太多的子類的場合