zoukankan      html  css  js  c++  java
  • 设计模式-中介者模式(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();
        }
    }

    补充描述:

  • 相关阅读:
    发现:在Silverlight for windows embedded 当中用户控件状态的改变的问题
    silverlight for windows embedded 当中资源的使用
    WINCE7自带DEMO_SmallMusic_wmpTitleBar_学习笔记
    silverlight for windows embbed 的键盘处理之一
    siverlight for windows embeddem 当中方便查看错误代码的类
    基于siverlight for windows embedded 项目开发的小工具
    对于OPENGL ES SURFACE的学习
    openg es 之一
    理解相机的相关参数的设置
    ListViewWebpart的开发
  • 原文地址:https://www.cnblogs.com/liaozh/p/3418463.html
Copyright © 2011-2022 走看看