行爲型模式:Mediator 中介者模式

                                                          行爲型模式:Mediator 中介者模式

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消息循環機制

相關文章
相關標籤/搜索