场景分析:

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

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

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

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

中介者模式的组成部分:

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

补充描述:

设计模式-中介者模式(Mediator)的更多相关文章

  1. 大话设计模式--中介者模式 Mediator --C++实现实例

    1. 中介者模式: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立改变他们之间的交互. Mediator的出现减少了各个Colleague的耦 ...

  2. 23种设计模式--中介者模式-Mediator Pattern

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  3. 深入浅出设计模式——中介者模式(Mediator Pattern)

    模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...

  4. 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...

  5. 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...

  6. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  7. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...

  9. JAVA 设计模式 中介者模式

    用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...

随机推荐

  1. css如何让表格table的边框为1像素呢

    在Html中使用table是网页制作中必不可缺的一部分,如果直接给css设置table里面的td边框为1像素的话,那么实际我们从网页上看到的效果却不是1像素. 那么我们怎么用css让table的边框为 ...

  2. mysql事务与mysql储存引擎

    事务概念及存储引擎 1.0 为何要事务? 先来看一个场景,银行转账汇款: 李彦宏和周鸿祎天天打架,现在让李彦宏给周鸿祎转款1000 元 设计如下表 account表 编号(id)用户名(user)金额 ...

  3. LeetCode 67. Add Binary

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  4. Find the Clones(字典树)

    链接:http://poj.org/problem?id=2945 Description Doubleville, a small town in Texas, was attacked by th ...

  5. So Hard (水题)

    题目网址:http://acm.fzu.edu.cn/problem.php?pid=2193 Problem Description 请将有限小数化为最简分数. Input 一个整数n 表示需要转化 ...

  6. 用js控制选项卡的隐藏与显示

    通过使用ul和div来,借助于jquery来实现选项卡的显示与隐藏 <form action="" method="post"> <div&g ...

  7. 图论Hrbust1708许可证

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1708 #include<st ...

  8. python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案

    Mac os x 升级到最新版后出现 python MysqlDB 无法找到 libmysqlclient.18.dylib 的问题,尝试的解决方案如下: 1.  升级更新 mysql 到最新版,无效 ...

  9. [Golang]Go Packages

    ---------------------------------------------------------------------------------------------------- ...

  10. Flash图表控件FusionCharts如何在图表中显示标识和图片

    在FusionCharts的图表中显示外部商标 使用FusionCharts之后,用户可以在运行时加载需要在图表中显示的外部标识/图片/图像.这个标识可以GIF / JPEG / PNG或SWF文件格 ...