C#设计模式——中介者模式(Mediator Pattern)
一、概述
在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进行修改将会非常困难。为了对系统的对象进行解耦,可以引入一个间接层来管理对象之间的关系,这就是中介者模式。
二、中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。其结构图如下:
Mediator作为中介者定义一个接口用于与各Colleague对象交互。
ConcreteMediator实现了Mediator接口,作为具体的中介者通过协调各Colleague对象实现协作行为。
每一个Colleague中都引用Mediator对象,通过该对象实现与其他Colleague的交互。
中介者模式利用Mediator实现了Colleague间的松耦合,但由于Mediator将Colleague间的复杂引用关系变成了Mediator的复杂性,随着逻辑的复杂化,Mediator对象可能会变得相当复杂。因此在实际使用中要慎用,以免Mediator的复杂性抵消中介者模式带来的好处。
三、示例
我们以一个汽车遥控器为例介绍一下中介者模式。例子比较简单没必要使用中介者模式,但可以以此了解一下该模式的使用方法。
首先定义Colleague。
1 public abstract class PlayerControllerButton
2 {
3 protected PlayerController _controller;
4 public bool Enable { get; set; }
5
6 public PlayerControllerButton(PlayerController controller)
7 {
8 _controller = controller;
9 }
10
11 public virtual void Click()
12 {
13 _controller.ClickButton(this);
14 }
15 }
16
17 public class StartButton : PlayerControllerButton
18 {
19 public StartButton(PlayerController controller)
20 : base(controller)
21 {
22 controller.Register(this);
23 }
24 }
25
26 public class StopButton : PlayerControllerButton
27 {
28 public StopButton(PlayerController controller)
29 : base(controller)
30 {
31 controller.Register(this);
32 }
33 }
34
35 public class PauseButton : PlayerControllerButton
36 {
37 public PauseButton(PlayerController controller)
38 : base(controller)
39 {
40 controller.Register(this);
41 }
42 }接着定义Mediator。
1 public class PlayerController
2 {
3 private StartButton _startButton;
4 private StopButton _stopButton;
5 private PauseButton _pauseButton;
6
7 public PlayerController()
8 {
9 }
10
11 public void Register(PlayerControllerButton button)
12 {
13 if (button.GetType().ToString() == "DesignPattern.Mediator.StartButton")
14 {
15 _startButton = button as StartButton;
16 }
17 else if (button.GetType().ToString() == "DesignPattern.Mediator.StopButton")
18 {
19 _stopButton = button as StopButton;
20 }
21 else if (button.GetType().ToString() == "DesignPattern.Mediator.PauseButton")
22 {
23 _pauseButton = button as PauseButton;
24 }
25 }
26
27 public void ClickButton(PlayerControllerButton button)
28 {
29 if (button == _startButton)
30 {
31 _startButton.Enable = true;
32 _stopButton.Enable = false;
33 _pauseButton.Enable = false;
34 }
35 else if (button == _stopButton)
36 {
37 _startButton.Enable = false;
38 _stopButton.Enable = true;
39 _pauseButton.Enable = false;
40 }
41 else if (button == _pauseButton)
42 &nbs
补充:软件开发 , C# ,