設計模式筆記(17)---中介者模式(行爲型)

Gof定義

用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式的相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。

動機

在軟件構建過程中,經常會出現多個對象互相關聯交互的情況,對象之間常常會維持一種複雜的引用關係,如果遇到一些需求的更改,這種直接的引用關係將面臨不斷的變化。在這種情況下,我們可使用一個“中介對象”來管理對象間的關聯關係,避免相互交互的對象之間的緊耦合引用關係,從而更好地抵禦變化。

中介者模式的結構圖:

2010-01-20_210319

代碼實現:

/// <summary>
/// 抽象的中介者
/// </summary>
public abstract class Mediator
{
    public abstract void Send(string msg, Colleague colleague);
}
/// <summary>
/// 抽象的同事類
/// </summary>
public abstract class Colleague
{
    protected Mediator _mediator;
    public Colleague(Mediator mediator)
    {
        _mediator = mediator;
    }
}
/// <summary>
/// 具體的中介者對象
/// </summary>
public class ConcreteMediator : Mediator
{
    public ConcreteCollegue1 Colleague1 { get; set; }
    public ConcreteCollegue2 Colleague2 { get; set; }
    public override void Send(string msg, Colleague colleague)
    {
        if (colleague == Colleague1)
        {
            Colleague2.Notify(msg);
        }
        else
        {
            Colleague1.Notify(msg);
        }
    }
}
/// <summary>
/// 具體的同事類1
/// </summary>
public class ConcreteCollegue1:Colleague
{
    public ConcreteCollegue1(Mediator mediator)
        : base(mediator)
    {

    }

    public void Send(string msg)
    {
        _mediator.Send(msg,this);
    }
    public void Notify(string msg)
    {
        Console.WriteLine("通知同事1:"+msg);
    }
}
/// <summary>
/// 具體的同事類2
/// </summary>
public class ConcreteCollegue2:Colleague
{
    public ConcreteCollegue2(Mediator mediator)
        : base(mediator)
    {

    }

    public void Send(string msg)
    {
        _mediator.Send(msg,this);
    }
    public void Notify(string msg)
    {
        Console.WriteLine("通知同事2:"+msg);
    }
}
/// <summary>
/// 客戶端調用
/// </summary>
class Program
{
    static void Main(string[] args)
    {
        ConcreteMediator cm = new ConcreteMediator();
        ConcreteCollegue1 cc1 = new ConcreteCollegue1(cm);
        ConcreteCollegue2 cc2 = new ConcreteCollegue2(cm);
        cm.Colleague1 = cc1;
        cm.Colleague2 = cc2;
        cc1.Send("看阿凡達了嗎?");
        cc2.Send("呵呵,週末公司組織去看。");
    }
}

Mediator模式的幾個要點

將多個對象間複雜的關聯關係解耦,Mediator模式將多個對象間的控制邏輯進行集中管理,變“多個對象互相關聯”爲“多個對象和一箇中介者關聯”,簡化了系統的維護,抵禦了可能的變化。
隨着控制邏輯的複雜化,Mediator具體對象的實現可能相當複雜。這時候可以對Mediator對象進行分解處理。
Façade模式是解耦系統外到系統內(單向)的對象關聯關係;Mediator模式是解耦系統內各個對象之間(雙向)的關聯關係。

發佈了115 篇原創文章 · 獲贊 1 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章