中介者(Mediator)

意圖

用一個中介對象封裝一系列的對象交互毕荐,中介者使各對象不需要顯示地相互引用郁惜,從而使其耦合松散涡上,而且可以獨立地改變它們之間的交互浑玛。

結構

中介者結構圖

動機

面向對象設計鼓勵將行為分布到各個對象中绍申,以提高這些行為的可復用性。但是顾彰,采用這種分割方式的系統(tǒng)极阅,也可能會引起對象之間的相互連接(直接引用)激增,反而降低了它們的可復用性(依賴與耦合過高)涨享。

中介者模式通過將集體行為封裝到一個獨立的中介者對象筋搏,由中介者負責控制和協調對象間的交互,使對象間不再相互顯式引用厕隧,提高可復用性奔脐。

適用性

  • 一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解吁讨;
  • 一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象髓迎;
  • 想定制一個分布在多個類中的行為,而又不想生成太多的子類建丧。

優(yōu)缺點

  • 中介者把各個對象組織在一起竖般,負責協調它們之間的業(yè)務邏輯。如果業(yè)務發(fā)生變化茶鹃,只需要生成Mediator子類即可涣雕,這樣各個Colleague類可被重用;
  • 中介者有利于各個Colleague之間的松耦合闭翩,可以獨立地改變和復用Mediator及Colleague挣郭;
  • 中介者抽象了對象間的協作行為,使關注點從對象本身的行為轉移到對象間的交互疗韵。有助于我們弄清楚一個系統(tǒng)中的對象是如何交互的兑障。
  • 中介者的集中化控制的特點,使得交互的復雜性變成了中介者的復雜性蕉汪。

其他

  • Mediator 與 Colleague 之間的通訊方式:
    1. 使用觀察者模式:Colleague類為Subject流译,Mediator類為Observer;
    2. 在Mediator中定義一個特殊的通知接口者疤,各Colleague在通知時直接調用該接口福澡。


示例

模擬一個圖形用戶界面,該界面有2個窗體控件:下拉列表框(ListBox)和文本框(TextBox)驹马。當下拉列表框某一項被選中時革砸,文本框的內容將自動更新除秀。

實現(C#)

圖形界面結構圖

以及它們之間的交互時序圖:

圖形用戶界面交互時序圖

using System;

public abstract class Mediator
{
    public abstract void CreateWidgets();
    public abstract void WidgetChanged(Widget widget);
}

public class DialogMediator : Mediator
{
    private ListBox list;
    private TextBox field;

    public override void CreateWidgets()
    {
        list = new ListBox(this);
        field = new TextBox(this);
    }

    public override void WidgetChanged(Widget widget)
    {
        if(widget is ListBox)
        {
            string text = list.GetSelectedItem();
            field.SetText(text);
        }
        // else if(widget is TextBox) ...
    }

    public ListBox ListBox { get { return this.list; }}
    public TextBox Field { get { return this.field; }}
    
}

// 圖形窗體的基類
public abstract class Widget
{
    private readonly Mediator mediator;

    protected Widget(Mediator mediator)
    {
        this.mediator = mediator;
    }

    public void Changed()
    {
        this.mediator.WidgetChanged(this);
    }
}

// 列表框控件
public class ListBox : Widget
{
    private readonly string[] items;
    private int selectedIndex = -1;

    public ListBox(Mediator mediator) : base(mediator)
    {
        items = new [] {"1.華為", "2.小米", "3.OPPO", "4.三星", "5.蘋果"};
    }

    public void SetSelectedItem(int index)
    {
        this.selectedIndex = index;

        // 引發(fā)一個事件。
        this.Changed();
    }

    public string GetSelectedItem()
    {
        if(this.selectedIndex >= 0 && this.selectedIndex < items.Length)
        {
            return items[this.selectedIndex];
        }
        else
        {
            return "未選中";
        }
    }

}

// 文本框控件
public class TextBox : Widget
{
    private string text;

    public TextBox(Mediator mediator) : base(mediator) {}

    public void SetText(string text)
    {
        this.text = text;
    }

    public string GetText()
    {
        return this.text;
    }
}

// 測試
public class App
{
    public static void Main(string[] args)
    {
        DialogMediator dialog = new DialogMediator();

        //1. 創(chuàng)建各個控件
        dialog.CreateWidgets();

        //2.模擬選中某個列表項動作
        dialog.ListBox.SetSelectedItem(2);
        Console.WriteLine(dialog.Field.GetText());

        //2.模擬選中某個列表項動作
        dialog.ListBox.SetSelectedItem(4);
        Console.WriteLine(dialog.Field.GetText());
    }
}

// 控制臺輸出:
//   3.OPPO
//   5.蘋果


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末算利,一起剝皮案震驚了整個濱河市册踩,隨后出現的幾起案子,更是在濱河造成了極大的恐慌效拭,老刑警劉巖暂吉,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異缎患,居然都是意外死亡慕的,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門较锡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來业稼,“玉大人,你說我怎么就攤上這事蚂蕴〉蜕ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵骡楼,是天一觀的道長熔号。 經常有香客問我,道長鸟整,這世上最難降的妖魔是什么引镊? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮篮条,結果婚禮上弟头,老公的妹妹穿的比我還像新娘。我一直安慰自己涉茧,他們只是感情好赴恨,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伴栓,像睡著了一般伦连。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钳垮,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天惑淳,我揣著相機與錄音,去河邊找鬼饺窿。 笑死歧焦,一個胖子當著我的面吹牛,可吹牛的內容都是我干的短荐。 我是一名探鬼主播倚舀,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叹哭,長吁一口氣:“原來是場噩夢啊……” “哼忍宋!你這毒婦竟也來了痕貌?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤糠排,失蹤者是張志新(化名)和其女友劉穎舵稠,沒想到半個月后铅协,有當地人在樹林里發(fā)現了一具尸體喧务,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年蹂季,在試婚紗的時候發(fā)現自己被綠了乾闰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落追。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涯肩,靈堂內的尸體忽然破棺而出轿钠,到底是詐尸還是另有隱情,我是刑警寧澤病苗,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布疗垛,位于F島的核電站,受9級特大地震影響硫朦,放射性物質發(fā)生泄漏贷腕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一咬展、第九天 我趴在偏房一處隱蔽的房頂上張望泽裳。 院中可真熱鬧,春花似錦破婆、人聲如沸涮总。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妹卿。三九已至,卻和暖如春蔑鹦,著一層夾襖步出監(jiān)牢的瞬間夺克,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工嚎朽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铺纽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓哟忍,卻偏偏與公主長得像狡门,于是被迫代替她去往敵國和親陷寝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容