中介者模式
定義
用一個中介物件來封裝一系列的物件互動,中介使各物件之間不需要顯示的相互參考,從而使其耦合松散,而且可以獨立的改變它們之間的互動,
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都復雜
常用情景
- 一組物件以定義良好但是復雜的方式進行互動通信的場合
- 需要定制一個分布在多個類中的行為,而又不想生成太多的子類的場合
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/32490.html
標籤:設計模式
