您的位置:首页 > 编程语言 > C#

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。

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: