動機:在系統構建過程中,經常出現多個對象相互關聯互動的情況,對象之間常常會維持一種複雜的參考關聯性,面對變化能力弱。用一個中介對象來封裝一系列的對象互動,中介者使各對象不需要顯式的相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的變化。
情境:考慮一個文字編輯器,包含剪下菜單、粘帖按鈕、文本編輯地區、剪貼簿等對象,它們需要相互引用和互動。
結構
代碼
namespace DesignPattern.Mediator
{
public abstract class Mediator
{
private IList<Control> controls;
public Mediator()
{
controls = new IList<Control> ();
}
// 管理互動
public abstract void ControlChanged(Control control);
public void Add(Control control)
{
controls.Add(control);
}
}
public class CutMediator : Mediator
{
public CutMediator()
: base()
{
}
public override void ControlChanged(Control control)
{
if (control is CutMenuItem)
{
}
else if (control is PasteButton)
{
}
else if (control is TextArea)
{
}
else if (control is ClipBoard)
{
}
}
}
}
namespace DesignPattern.Mediator
{
public abstract class Control
{
private Mediator mediator;
public Control(Mediator mediator)
{
this.mediator = mediator;
}
public virtual void Changed()
{
mediator.ControlChanged(this);
}
}
public class CutMenuItem : Control
{
public CutMenuItem(Mediator mediator)
: base(mediator)
{
}
public override void Changed()
{
//
base.Changed();
}
}
public class PasteButton : Control
{
public PasteButton(Mediator mediator)
: base(mediator)
{
}
public override void Changed()
{
//
base.Changed();
}
}
public class TextArea : Control
{
public TextArea(Mediator mediator)
: base(mediator)
{
}
public override void Changed()
{
//
base.Changed();
}
}
public class ClipBoard : Control
{
public ClipBoard(Mediator mediator)
: base(mediator)
{
}
public override void Changed()
{
//
base.Changed();
}
}
}
要點:
1、本模式將多個對象間複雜的關聯關係解耦,對多個對象間的控制邏輯進行集中管理,變“多個對象互相關聯”為“多個對象和一個中介者關聯”,簡化了系統維護,能更好地面對變化。
2、隨著控制邏輯的複雜化,Mediator具體對象的實現可能相當複雜,這時候可對其進行分解處理。
3、Facade模式是解耦系統外到系統內(單向)的對象關聯關係;本模式是解耦系統內各個對象之間(雙向)的關聯關係。