設計模式-中介者模式(Mediator)

場景分析:ide

衆所周知,電腦有不少組成部分,如硬盤、內存、光驅、音頻、鍵盤等,各個組件之間協同工做才能保證電腦的正常運行。測試

若是各個組件之間直接交互,可能會比較複雜,以下圖:spa

@Q)YSG6MBBN7~A04}UP4SBW

將上面的各個組件抽象成類,顯然,類之間交互過多,違反了軟件工程中鬆耦合的思想。試想按照這麼設計,若是電腦後面新增一個功能或者修改一個功能,改動難度將會極大。設計

實際上,在電腦設計中,考慮到上面的因素,使用了主板來解決這個問題。主板自己做爲一箇中介者,內部包含各個組件之間的協調功能。使用了主板角色之後,上面的圖就變成了這樣。code

P5VJ7(}$C_4GF6[8PMY`AFJ

中介者模式的組成部分:視頻

a. Colleagueclass,通常稱爲同事類,即上面的電腦組件,如硬盤、內存、光驅、鍵盤、音頻等,他們之間不互相通訊,他們都只同中介者,即上面的主板,通訊。對象

所以,每個同事對象都須要知道中介者。blog

b.Mediator,中介者接口,用於與各個同事對象對話的標準。接口

c.ConcreteMediator.具體中介者對象。協調各同事對象的協做行爲。內存

因爲中介者內部須要調用同事對象的方法,所以須要維護各個同事。

在上面的例子上,若是鍵盤觸發了播放功能,硬盤會找到相對應的視頻文件,音頻將會播放音樂。

代碼實現:

各個同事類僅定義簡單方法,不用關心調用問題

/// <summary>
///
鍵盤
/// </summary>
public class KeyBoard
{
    public void InputPlayCommand()
    {
        Console.WriteLine("Play a song!");
    }
}

/// <summary>
///
硬盤
/// </summary>
public class HardDisk
{
    public void FindPlayFile()
    {
        Console.WriteLine("Find a song!");
    }
}

/// <summary>
///
音頻
/// </summary>
public class Audio
{
    public void Play()
    {
        Console.WriteLine("The song is playing!");
    }
}

中介者抽象類主板和子類華碩主板,將各個組件直接的調用統一放在中介者子類中實現:

/// <summary>
   /// 主板
   /// </summary>
   abstract class Mediator
   {
       public abstract void Play();
   }

   /// <summary>
   /// 華碩主板
   /// </summary>
   class AsusMediator : Mediator
   {
       //中介者(華碩主板)內部須要知道全部同事對象(鍵盤、硬盤、音頻)
       private KeyBoard _keyBoard;
       private HardDisk _hardDisk;
       private Audio _audio;

       public AsusMediator(KeyBoard aKeyBoard, HardDisk aHardDisk, Audio aAudio)
       {
           _keyBoard = aKeyBoard;
           _hardDisk = aHardDisk;
           _audio = aAudio;
       }

       public override void Play()
       {
           _keyBoard.InputPlayCommand();
           _hardDisk.FindPlayFile();
           _audio.Play();
       }
   }
 
測試類:
class MediatorTest
{
    public static void Main(string[] args)
    {
        KeyBoard keyBoard = new KeyBoard();
        HardDisk hardDisk = new HardDisk();
        Audio audio = new Audio();

        AsusMediator mediator = new AsusMediator(keyBoard, hardDisk, audio);
        mediator.Play();

        Console.ReadLine();
    }
}

補充描述:

相關文章
相關標籤/搜索