• 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     }
  • 相关阅读:
    455. Assign Cookies(分饼干)(leetcode)
    栈的压入、弹出序列 (剑指offer)
    第五届蓝桥杯c/c++B组1
    第六届蓝桥杯试题c/c++B组8
    第六届蓝桥杯试题c/c++B组7
    第六届蓝桥杯试题c/c++B组6
    第六届蓝桥杯试题c/c++B组5
    第六届蓝桥杯试题c/c++B组4
    第六届蓝桥杯试题c/c++B组3
    第六届蓝桥杯试题c/c++B组2
  • 原文地址:https://www.cnblogs.com/saville/p/3021146.html
Copyright © 2020-2023  润新知