C#设计模式——中介者模式(Mediator Pattern)

一、概述

在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进行修改将会非常困难。为了对系统的对象进行解耦,可以引入一个间接层来管理对象之间的关系,这就是中介者模式。

二、中介者模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。其结构图如下:

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             {

43                 _startButton.Enable = false;

44                 _stopButton.Enable = false;

45                 _pauseButton.Enable = true;

46             }

47         }

48 

49         public void DisplayButtonState()

50         {

51             Console.WriteLine("StartButton is {0}, StopButton is {1}, PauseButton is {2}", _startButton.Enable, _stopButton.Enable, _pauseButton.Enable);

52         }

53     }

 

 

你可能感兴趣的:(Pattern)