1、依賴關係的轉化
1)多個對象之間的相互依賴是很是複雜的,這些對像都是兩兩直接依賴,而用實現細節依賴於抽象的作法對於這種狀況已經不夠用了,由於這裏不是兩個對象之間的關係,而是多個對象之間的關係。
2)咱們將這些對象的依賴關係轉化成都不直接相互依賴,而是將這些對象都依賴於一個接口,這個接口就是一箇中介者。
2、動機(Motivation)
1)在軟件構建過程當中,常常會出現多個對象互相關聯交互的狀況,對象之間經常會維持一種複雜的引用關係,若是遇到一些需求的更改,這種直接的引用關係將面臨不斷的變化。
2)在這種狀況下,咱們可以使用一個「中介對象」來管理對象間的關聯關係,避免相互交互的對象之間的緊耦合引用關係,從而更好地抵禦變化。
3、意圖(Intent)
用一箇中介對象來封裝一系列對象交互。中介者使各對象不須要顯式的相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。
——《設計模式》GoF
4、實例:菜單和工具欄按鈕
1)先看結構:這個類之間的關係很複雜
//菜單:剪切菜單按鈕,映射一些行爲
public class CutMenuItem
{
TextArea textArea;
ClipBorad clipBorad;
ToolBarButton toolBarButton;
public void Click()
{
string text = textArea.SelectedText();
textArea.RemoveSelectionText();
clipBoard.SetData(text);
//啓用粘粘按鈕
toolBarButton.EnabledPasteButton(true);
}
}設計模式
//文本區域
public class TextArea
{
ClipBorad clipBoard;
ToolBarButton toolBarButton;
CutMenuItem cutMenuItem;
public void Process()
{
//......
}
}架構
//剪切板
public class ClipBorad
{
CutMenuItem cutMenuItem;
TextArea textArea;
ToolBarButton toolBarButton;
//......
}ide
//工具欄:粘貼按鈕
public class ToolBarButton
{
CutMenuItem cutMenuItem;
TextArea textArea;
ClipBorad clipBoard;
//......
}工具
2)演化成中介者設計模式
//抽象類:中介者
public abstract class Mediator
{
ArrayList list = new ArrayList();
public abstract void Notify();
public virtual void AddElement(Element element)
{
list.Add(element);
}
} this
//抽象類:
public abstract class Element
{
Mediator mediator;
public Element(Mediator mediator)
{
this.mediator = mediator;
this.mediator.AddElement(this);
}
protected virtual void OnChange()
{
mediator.Notify();
}
}
//Element的子類
//菜單:剪切菜單按鈕,映射一些行爲
public class CutMenuItem : Element
{
public CutMenuItem(Mediator mediator) : base(mediator)
{
//...
}
public void Click()
{
OnChange();
}
}設計
//文本區域
public class TextArea : Element
{
public TextArea(Mediator mediator) : base(mediator)
{
//...
}
public void Process()
{
OnChange();
}
}對象
//剪切板
public class ClipBorad : Element
{
public ClipBorad(Mediator mediator) : base(mediator)
{
//...
}
public void Invoke()
{
OnChange();
}
}接口
//工具欄:粘貼按鈕
public class ToolBarButton : Element
{
public ToolBarButton(Mediator mediator) : base(mediator)
{
//...
}
public void Click()
{
OnChange();
}
}ip
//中介者Mediator的子類
public class ConcreteMediator : Mediator
{
public override void Notify()
{
}
}element
5、Mediator模式的幾個要點
1)將多個對象間複雜的關聯關係解耦,Mediator模式將多個對象間的控制邏輯進行集中管理,變「多個對象互相關聯」爲「多個對象和一箇中介者關聯」,簡化了系統的維護,抵禦了可能的變化。
2)隨着控制邏輯的複雜化,Mediator具體對象的實現可能至關複雜。這時候能夠對Mediator對象進行分解處理。
3)Facade模式是解耦系統外到系統內(單向)的對象關聯關係;Mediator模式是解耦系統各個對象之間(雙向)的關聯關係。
6、.NET架構中的Mediator 應用:Windows消息循環機制