場景分析:ide
衆所周知,電腦有不少組成部分,如硬盤、內存、光驅、音頻、鍵盤等,各個組件之間協同工做才能保證電腦的正常運行。測試
若是各個組件之間直接交互,可能會比較複雜,以下圖:spa
將上面的各個組件抽象成類,顯然,類之間交互過多,違反了軟件工程中鬆耦合的思想。試想按照這麼設計,若是電腦後面新增一個功能或者修改一個功能,改動難度將會極大。設計
實際上,在電腦設計中,考慮到上面的因素,使用了主板來解決這個問題。主板自己做爲一箇中介者,內部包含各個組件之間的協調功能。使用了主板角色之後,上面的圖就變成了這樣。code
中介者模式的組成部分:視頻
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(); } }
補充描述: