设计模式-中介者模式(Mediator)
场景分析:
众所周知,电脑有很多组成部分,如硬盘、内存、光驱、音频、键盘等,各个组件之间协同工作才能保证电脑的正常运行。
如果各个组件之间直接交互,可能会比较复杂,如下图:
将上面的各个组件抽象成类,显然,类之间交互过多,违反了软件工程中松耦合的思想。试想按照这么设计,如果电脑后面新增一个功能或者修改一个功能,改动难度将会极大。
实际上,在电脑设计中,考虑到上面的因素,使用了主板来解决这个问题。主板本身作为一个中介者,内部包含各个组件之间的协调功能。使用了主板角色以后,上面的图就变成了这样。
中介者模式的组成部分:
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)的更多相关文章
- 大话设计模式--中介者模式 Mediator --C++实现实例
1. 中介者模式: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立改变他们之间的交互. Mediator的出现减少了各个Colleague的耦 ...
- 23种设计模式--中介者模式-Mediator Pattern
一.中介者模式的介绍 中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...
- 深入浅出设计模式——中介者模式(Mediator Pattern)
模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...
- 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- JAVA 设计模式 中介者模式
用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...
随机推荐
- Python进阶07 函数对象
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象 ...
- [ActionScript 3.0] AS3 绘制正四面体(线条)
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; im ...
- eclips中增加对jar包的引用
http://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html
- C# 文件压缩与解压(ZIP格式)
在企业开发过程中经常会遇到文件的压缩与解压,虽然网上很多流行的压缩文件格式都是RAR的,但是由于RAR不是一个开放的标准,因此ZIP成了更多人的选择.如果你不想自己开发的话可以选择开源的项目,比如Sh ...
- var obj = {};var obj2 = [];var obj3;
<script> var obj = {}; console.log(obj); var obj2 = []; console.log(obj2); var obj3; console.l ...
- mysql 使用说明-1
以下内容是根据官方文档翻译的,执行截图是博主自己实测结果. 3.1 Connecting to and Disconnecting from the Server 连接,断开数据库 要连接到mysql ...
- 项目积累——Strus、Hibernate
在Struts-config.xml中对ActionForm Bean的生命周期用scope进行定义,可用的选项有:pageContext(缺省).request(常用).session.applic ...
- 移植ok6410
tftp u-boot.bin http://blog.csdn.net/link_hui/article/details/5593518 LED driver http://blog.csdn.ne ...
- DP小乐乐化妆品
Hrbust1814 http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1814 #in ...
- [AFUI]App Framework
---------------------------------------------------------------------------------------------------- ...