C#设计模式——中介者模式(Mediator Pattern)
2013-04-14 22:24
901 查看
一、概述
在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进行修改将会非常困难。为了对系统的对象进行解耦,可以引入一个间接层来管理对象之间的关系,这就是中介者模式。
二、中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。其结构图如下:
Mediator作为中介者定义一个接口用于与各Colleague对象交互。
ConcreteMediator实现了Mediator接口,作为具体的中介者通过协调各Colleague对象实现协作行为。
每一个Colleague中都引用Mediator对象,通过该对象实现与其他Colleague的交互。
中介者模式利用Mediator实现了Colleague间的松耦合,但由于Mediator将Colleague间的复杂引用关系变成了Mediator的复杂性,随着逻辑的复杂化,Mediator对象可能会变得相当复杂。因此在实际使用中要慎用,以免Mediator的复杂性抵消中介者模式带来的好处。
三、示例
我们以一个汽车遥控器为例介绍一下中介者模式。例子比较简单没必要使用中介者模式,但可以以此了解一下该模式的使用方法。
首先定义Colleague。
接着定义Mediator。
在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进行修改将会非常困难。为了对系统的对象进行解耦,可以引入一个间接层来管理对象之间的关系,这就是中介者模式。
二、中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。其结构图如下:
Mediator作为中介者定义一个接口用于与各Colleague对象交互。
ConcreteMediator实现了Mediator接口,作为具体的中介者通过协调各Colleague对象实现协作行为。
每一个Colleague中都引用Mediator对象,通过该对象实现与其他Colleague的交互。
中介者模式利用Mediator实现了Colleague间的松耦合,但由于Mediator将Colleague间的复杂引用关系变成了Mediator的复杂性,随着逻辑的复杂化,Mediator对象可能会变得相当复杂。因此在实际使用中要慎用,以免Mediator的复杂性抵消中介者模式带来的好处。
三、示例
我们以一个汽车遥控器为例介绍一下中介者模式。例子比较简单没必要使用中介者模式,但可以以此了解一下该模式的使用方法。
首先定义Colleague。
public abstract class PlayerControllerButton { protected PlayerController _controller; public bool Enable { get; set; } public PlayerControllerButton(PlayerController controller) { _controller = controller; } public virtual void Click() { _controller.ClickButton(this); } } public class StartButton : PlayerControllerButton { public StartButton(PlayerController controller) : base(controller) { controller.Register(this); } } public class StopButton : PlayerControllerButton { public StopButton(PlayerController controller) : base(controller) { controller.Register(this); } } public class PauseButton : PlayerControllerButton { public PauseButton(PlayerController controller) : base(controller) { controller.Register(this); } }
接着定义Mediator。
public class PlayerController { private StartButton _startButton; private StopButton _stopButton; private PauseButton _pauseButton; public PlayerController() { } public void Register(PlayerControllerButton button) { if (button.GetType().ToString() == "DesignPattern.Mediator.StartButton") { _startButton = button as StartButton; } else if (button.GetType().ToString() == "DesignPattern.Mediator.StopButton") { _stopButton = button as StopButton; } else if (button.GetType().ToString() == "DesignPattern.Mediator.PauseButton") { _pauseButton = button as PauseButton; } } public void ClickButton(PlayerControllerButton button) { if (button == _startButton) { _startButton.Enable = true; _stopButton.Enable = false; _pauseButton.Enable = false; } else if (button == _stopButton) { _startButton.Enable = false; _stopButton.Enable = true; _pauseButton.Enable = false; } else if (button == _pauseButton) { _startButton.Enable = false; _stopButton.Enable = false; _pauseButton.Enable = true; } } public void DisplayButtonState() { Console.WriteLine("StartButton is {0}, StopButton is {1}, PauseButton is {2}", _startButton.Enable, _stopButton.Enable, _pauseButton.Enable); } }
相关文章推荐
- C#设计模式(18)——中介者模式(Mediator Pattern)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- C#设计模式之十七中介者模式(Mediator Pattern)【行为型】
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- C#设计模式(18)——中介者模式(Mediator Pattern)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- C#设计模式之十七中介者模式(Mediator Pattern)【行为型】
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 二十.行为型设计模式——Mediator Pattern(中介者模式)
- java设计模式---中介者模式(Mediator pattern)
- Net设计模式实例之中介者模式(Mediator Pattern)(1) 推荐
- C# 设计模式-中介者(Mediator)
- Net设计模式实例之中介者模式(Mediator Pattern)(2)
- 设计模式 中介者模式(Mediator Pattern)
- Java设计模式之中介者模式(Mediator Pattern)简介
- 深入浅出设计模式——中介者模式(Mediator Pattern)
- 我所理解的设计模式(C++实现)——中介者模式(Mediator Pattern)
- 我所理解的设计模式(C++实现)——中介者模式(Mediator Pattern)
- 设计模式读书笔记之中介者模式(mediator pattern)
- 设计模式第十一课 中介者模式 Mediator Pattern