#中介者模式(Mediator Pattern)
##簡介
在用戶與用戶直接聊天的設計方案中,用戶對象之間存在很強的關聯性,將導致系統出現如下問題:
* 系統結構復雜:對象之間存在大量的相互關聯和調用,若有一個對象發生變化,則需要跟蹤和該對象關聯的其他所有對象,并進行適當處理。
* 對象可重用性差:由于一個對象和其他對象具有很強的關聯,若沒有其他對象的支持,一個對象很難被另一個系統或模塊重用,這些對象表現出來更像一個不可分割的整體,職責較為混亂。
* 系統擴展性低:增加一個新的對象需要在原有相關對象上增加引用,增加新的引用關系也需要調整原有對象,系統耦合度很高,對象操作很不靈活,擴展性差。
* 在面向對象的軟件設計與開發過程中,根據“單一職責原則”,我們應該盡量將對象細化,使其只負責或呈現單一的職責。
* 對于一個模塊,可能由很多對象構成,而且這些對象之間可能存在相互的引用,為了減少對象兩兩之間復雜的引用關系,使之成為一個松耦合的系統,我們需要使用中介者模式,這就是中介者模式的模式動機。
***中介者模式(Mediator Pattern)定義:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。中介者模式又稱為調停者模式,它是一種對象行為型模式。***
##案例
安理會做中介
```
//聯合國機構
abstract class UnitedNations
{
//聲明
public abstract void Declare(string message,Country colleagues);
}
```
國家類 相當于Colleague類
```
abstract class Country
{
protected UnitedNations mediator;
public Country(UnitedNations mediator)
{
this.mediator = mediator;
}
}
```
美國類 相當于ConcreteColleague1類
```
class USA: Country
{
public USA(UnitedNations mediator): base(mediator)
{}
//聲明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//獲得消息
public void GetMessage(string message)
{
Console.WriteLine("美國獲得對方消息" + message);
}
}
```
伊拉克類 相當于ConcreteColleague2類
```
class Iraq: Country
{
public Iraq(UnitedNations mediator): base(mediator)
{}
//聲明
public void Declare(string message)
{
mediator.Declare(message, this);
}
//獲得消息
public void GetMessage(string message)
{
Console.WriteLine("美國獲得對方消息" + message);
}
}
```
聯合國安理會 相當于ConcreteMediator類
```
//聯合國安全理事會
class UnitedNationsSecurityCouncil: UnitedNations
{
private USA colleague1;
private Iraq colleague2;
//美國
public USA Colleague1
{
set {colleague1 = value;}
}
//伊拉克
public Iraq Colleague2
{
set {colleague2 = value;}
}
//聲明
public override void Declare(string message, Country colleague)
{
if(colleague == colleague1)
{
colleague2.GetMessage(message);
}else
{
colleague1.GetMessage(message);
}
}
}
```
客戶端調用
```
static void Main(string[] args)
{
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
USA c1 = new USA(UNSC);
Iraq c2 = new Iraq(UNSC);
UNSC.Colleague1 = c1;
UNSC.Colleague2 = c2;
c1.Declare("不準研發核武器");
c2.Declare("我們沒有,但我們不怕侵略");
Console.Read();
}
```
中介者模式的優點首先是Mediator的出現減少了各個Colleague的耦合,可以毒瘤地改變和復用各個Colleague類和Mediator。其次由于把對象如何協作進行類抽象,將中介作為一個獨立的概念并且將其封裝在一個對象中,這樣關注的對象就從對象本身的行為轉移到它們的交互上來,也就是站在一個更宏觀的角度去看待系統。
但是,由于ConcreyeMediator控制了集中化,于是就把交互復雜性變為了中介者的復雜性,這就使得中介者會變得比任何一個ConcreteColleague都復雜。