设计模式-中介者模式(Mediator)

场景分析:

众所周知,电脑有很多组成部分,如硬盘、内存、光驱、音频、键盘等,各个组件之间协同工作才能保证电脑的正常运行。

如果各个组件之间直接交互,可能会比较复杂,如下图:

@Q)YSG6MBBN7~A04}UP4SBW

将上面的各个组件抽象成类,显然,类之间交互过多,违反了软件工程中松耦合的思想。试想按照这么设计,如果电脑后面新增一个功能或者修改一个功能,改动难度将会极大。

实际上,在电脑设计中,考虑到上面的因素,使用了主板来解决这个问题。主板本身作为一个中介者,内部包含各个组件之间的协调功能。使用了主板角色以后,上面的图就变成了这样。

P5VJ7(}$C_4GF6[8PMY`AFJ

中介者模式的组成部分:

a. Colleagueclass,一般称为同事类,即上面的电脑组件,如硬盘、内存、光驱、键盘、音频等,他们之间不互相通信,他们都只同中介者,即上面的主板,通信。

因此,每一个同事对象都需要知道中介者。

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();
    }
}

补充描述:

posted @ 2013-11-11 20:34  liaozh  阅读(237)  评论(0编辑  收藏  举报