黄江镇长龙小学:设计模式22:Mediator Pattern (调解者模式)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 22:05:58

设计模式22:Mediator Pattern (调解者模式)

分类: 设计模式 2009-07-09 13:42 131人阅读 评论(0) 收藏 举报

英文原文:http://www.dofactory.com/Patterns/PatternMediator.aspx

一、Mediator Pattern (调解者模式)的定义

Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.

定义一个对象将一系列对象如何相互作用的操作进行封装。调解者通过避免一个对象明确指向其余的对象来促使自由耦合,同时能够让你单独的改变他们之间的相互作用。

二、UML类图

  • Mediator  (IChatroom)
    • 定义一个接口用于与同事级对象进行通信
  • ConcreteMediator  (Chatroom)
    • 通过与同事级对象进行对等来实现相互协作行为
    • 知道并且维持本身的同事级对象
  • Colleague classes  (Participant)
    • 每个同事级对象都知道自己的调节者对象
    • 每个同事级对象在与另外的同事级对象进行通信时必须要与调节者进行通信。

    三、调解者模式实例代码

    view plain

    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5.   
    6. namespace Mediator_Pattern  
    7. {  
    8.     ///   
    9.   
    10.     /// MainApp startup class for Structural   
    11.   
    12.     /// Mediator Design Pattern.  
    13.   
    14.     ///   
    15.   
    16.     class MainApp  
    17.     {  
    18.   
    19.         ///   
    20.   
    21.         /// Entry point into console application.  
    22.   
    23.         ///   
    24.   
    25.         static void Main()  
    26.         {  
    27.   
    28.             ConcreteMediator m = new ConcreteMediator();  
    29.   
    30.   
    31.   
    32.             ConcreteColleague1 c1 = new ConcreteColleague1(m);  
    33.   
    34.             ConcreteColleague2 c2 = new ConcreteColleague2(m);  
    35.   
    36.   
    37.   
    38.             m.Colleague1 = c1;  
    39.   
    40.             m.Colleague2 = c2;  
    41.   
    42.   
    43.   
    44.             c1.Send("How are you?");  
    45.   
    46.             c2.Send("Fine, thanks");  
    47.   
    48.   
    49.   
    50.             // Wait for user  
    51.   
    52.             Console.ReadKey();  
    53.   
    54.         }  
    55.   
    56.     }  
    57.   
    58.   
    59.   
    60.     ///   
    61.   
    62.     /// The 'Mediator' abstract class  
    63.   
    64.     ///   
    65.   
    66.     abstract class Mediator  
    67.     {  
    68.   
    69.         public abstract void Send(string message,  
    70.   
    71.           Colleague colleague);  
    72.   
    73.     }  
    74.   
    75.   
    76.   
    77.     ///   
    78.   
    79.     /// The 'ConcreteMediator' class  
    80.   
    81.     ///   
    82.   
    83.     class ConcreteMediator : Mediator  
    84.     {  
    85.   
    86.         private ConcreteColleague1 _colleague1;  
    87.   
    88.         private ConcreteColleague2 _colleague2;  
    89.   
    90.   
    91.   
    92.         public ConcreteColleague1 Colleague1  
    93.         {  
    94.   
    95.             set { _colleague1 = value; }  
    96.   
    97.         }  
    98.   
    99.   
    100.   
    101.         public ConcreteColleague2 Colleague2  
    102.         {  
    103.   
    104.             set { _colleague2 = value; }  
    105.   
    106.         }  
    107.   
    108.   
    109.   
    110.         public override void Send(string message,  
    111.   
    112.           Colleague colleague)  
    113.         {  
    114.   
    115.             if (colleague == _colleague1)  
    116.             {  
    117.   
    118.                 _colleague2.Notify(message);  
    119.   
    120.             }  
    121.   
    122.             else  
    123.             {  
    124.   
    125.                 _colleague1.Notify(message);  
    126.   
    127.             }  
    128.   
    129.         }  
    130.   
    131.     }  
    132.   
    133.   
    134.   
    135.     ///   
    136.   
    137.     /// The 'Colleague' abstract class  
    138.   
    139.     ///   
    140.   
    141.     abstract class Colleague  
    142.     {  
    143.   
    144.         protected Mediator mediator;  
    145.   
    146.   
    147.   
    148.         // Constructor  
    149.   
    150.         public Colleague(Mediator mediator)  
    151.         {  
    152.   
    153.             this.mediator = mediator;  
    154.   
    155.         }  
    156.   
    157.     }  
    158.   
    159.   
    160.   
    161.     ///   
    162.   
    163.     /// A 'ConcreteColleague' class  
    164.   
    165.     ///   
    166.   
    167.     class ConcreteColleague1 : Colleague  
    168.     {  
    169.   
    170.         // Constructor  
    171.   
    172.         public ConcreteColleague1(Mediator mediator)  
    173.   
    174.             : base(mediator)  
    175.         {  
    176.   
    177.         }  
    178.   
    179.   
    180.   
    181.         public void Send(string message)  
    182.         {  
    183.   
    184.             mediator.Send(message, this);  
    185.   
    186.         }  
    187.   
    188.   
    189.   
    190.         public void Notify(string message)  
    191.         {  
    192.   
    193.             Console.WriteLine("Colleague1 gets message: "  
    194.   
    195.               + message);  
    196.   
    197.         }  
    198.   
    199.     }  
    200.   
    201.   
    202.   
    203.     ///   
    204.   
    205.     /// A 'ConcreteColleague' class  
    206.   
    207.     ///   
    208.   
    209.     class ConcreteColleague2 : Colleague  
    210.     {  
    211.   
    212.         // Constructor  
    213.   
    214.         public ConcreteColleague2(Mediator mediator)  
    215.   
    216.             : base(mediator)  
    217.         {  
    218.   
    219.         }  
    220.   
    221.   
    222.   
    223.         public void Send(string message)  
    224.         {  
    225.   
    226.             mediator.Send(message, this);  
    227.   
    228.         }  
    229.   
    230.   
    231.   
    232.         public void Notify(string message)  
    233.         {  
    234.   
    235.             Console.WriteLine("Colleague2 gets message: "  
    236.   
    237.               + message);  
    238.   
    239.         }  
    240.   
    241.     }  
    242. }  

    四、另外一个使用调解者模式的实例代码

    这个现实世界中的代码演示了Mediator模式,促进注册调停者的不同参与者之间的松耦合通信。调停者是中央枢纽,所有通信通过它发生。在这一点上,只有一到一个通讯在调停者中实施,但会是情谊的改变到一到多。

    view plain

    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5.   
    6. namespace Mediator_Pattern  
    7. {  
    8.     ///   
    9.   
    10.     /// MainApp startup class for Real-World   
    11.   
    12.     /// Mediator Design Pattern.  
    13.   
    14.     ///   
    15.   
    16.     class MainApp  
    17.     {  
    18.   
    19.         ///   
    20.   
    21.         /// Entry point into console application.  
    22.   
    23.         ///   
    24.   
    25.         static void Main()  
    26.         {  
    27.   
    28.             // Create chatroom  
    29.   
    30.             Chatroom chatroom = new Chatroom();  
    31.   
    32.   
    33.   
    34.             // Create participants and register them  
    35.   
    36.             Participant George = new Beatle("George");  
    37.   
    38.             Participant Paul = new Beatle("Paul");  
    39.   
    40.             Participant Ringo = new Beatle("Ringo");  
    41.   
    42.             Participant John = new Beatle("John");  
    43.   
    44.             Participant Yoko = new NonBeatle("Yoko");  
    45.   
    46.   
    47.   
    48.             chatroom.Register(George);  
    49.   
    50.             chatroom.Register(Paul);  
    51.   
    52.             chatroom.Register(Ringo);  
    53.   
    54.             chatroom.Register(John);  
    55.   
    56.             chatroom.Register(Yoko);  
    57.   
    58.   
    59.   
    60.             // Chatting participants  
    61.   
    62.             Yoko.Send("John", "Hi John!");  
    63.   
    64.             Paul.Send("Ringo", "All you need is love");  
    65.   
    66.             Ringo.Send("George", "My sweet Lord");  
    67.   
    68.             Paul.Send("John", "Can't buy me love");  
    69.   
    70.             John.Send("Yoko", "My sweet love");  
    71.   
    72.   
    73.   
    74.             // Wait for user  
    75.   
    76.             Console.ReadKey();  
    77.   
    78.         }  
    79.   
    80.     }  
    81.   
    82.   
    83.   
    84.     ///   
    85.   
    86.     /// The 'Mediator' abstract class  
    87.   
    88.     ///   
    89.   
    90.     abstract class AbstractChatroom  
    91.     {  
    92.   
    93.         public abstract void Register(Participant participant);  
    94.   
    95.         public abstract void Send(  
    96.   
    97.           string from, string to, string message);  
    98.   
    99.     }  
    100.   
    101.   
    102.   
    103.     ///   
    104.   
    105.     /// The 'ConcreteMediator' class  
    106.   
    107.     ///   
    108.   
    109.     class Chatroom : AbstractChatroom  
    110.     {  
    111.   
    112.         private Dictionary _participants =  
    113.   
    114.           new Dictionary();  
    115.   
    116.   
    117.   
    118.         public override void Register(Participant participant)  
    119.         {  
    120.   
    121.             if (!_participants.ContainsValue(participant))  
    122.             {  
    123.   
    124.                 _participants[participant.Name] = participant;  
    125.   
    126.             }  
    127.   
    128.   
    129.   
    130.             participant.Chatroom = this;  
    131.   
    132.         }  
    133.   
    134.   
    135.   
    136.         public override void Send(  
    137.   
    138.           string from, string to, string message)  
    139.         {  
    140.   
    141.             Participant participant = _participants[to];  
    142.   
    143.   
    144.   
    145.             if (participant != null)  
    146.             {  
    147.   
    148.                 participant.Receive(from, message);  
    149.   
    150.             }  
    151.   
    152.         }  
    153.   
    154.     }  
    155.   
    156.   
    157.   
    158.     ///   
    159.   
    160.     /// The 'AbstractColleague' class  
    161.   
    162.     ///   
    163.   
    164.     class Participant  
    165.     {  
    166.   
    167.         private Chatroom _chatroom;  
    168.   
    169.         private string _name;  
    170.   
    171.   
    172.   
    173.         // Constructor  
    174.   
    175.         public Participant(string name)  
    176.         {  
    177.   
    178.             this._name = name;  
    179.   
    180.         }  
    181.   
    182.   
    183.   
    184.         // Gets participant name  
    185.   
    186.         public string Name  
    187.         {  
    188.   
    189.             get { return _name; }  
    190.   
    191.         }  
    192.   
    193.   
    194.   
    195.         // Gets chatroom  
    196.   
    197.         public Chatroom Chatroom  
    198.         {  
    199.   
    200.             set { _chatroom = value; }  
    201.   
    202.             get { return _chatroom; }  
    203.   
    204.         }  
    205.   
    206.   
    207.   
    208.         // Sends message to given participant  
    209.   
    210.         public void Send(string to, string message)  
    211.         {  
    212.   
    213.             _chatroom.Send(_name, to, message);  
    214.   
    215.         }  
    216.   
    217.   
    218.   
    219.         // Receives message from given participant  
    220.   
    221.         public virtual void Receive(  
    222.   
    223.           string from, string message)  
    224.         {  
    225.   
    226.             Console.WriteLine("{0} to {1}: '{2}'",  
    227.   
    228.               from, Name, message);  
    229.   
    230.         }  
    231.   
    232.     }  
    233.   
    234.   
    235.   
    236.     ///   
    237.   
    238.     /// A 'ConcreteColleague' class  
    239.   
    240.     ///   
    241.   
    242.     class Beatle : Participant  
    243.     {  
    244.   
    245.         // Constructor  
    246.   
    247.         public Beatle(string name)  
    248.   
    249.             : base(name)  
    250.         {  
    251.   
    252.         }  
    253.   
    254.   
    255.   
    256.         public override void Receive(string from, string message)  
    257.         {  
    258.   
    259.             Console.Write("To a Beatle: ");  
    260.   
    261.             base.Receive(from, message);  
    262.   
    263.         }  
    264.   
    265.     }  
    266.   
    267.   
    268.   
    269.     ///   
    270.   
    271.     /// A 'ConcreteColleague' class  
    272.   
    273.     ///   
    274.   
    275.     class NonBeatle : Participant  
    276.     {  
    277.   
    278.         // Constructor  
    279.   
    280.         public NonBeatle(string name)  
    281.   
    282.             : base(name)  
    283.         {  
    284.   
    285.         }  
    286.   
    287.   
    288.   
    289.         public override void Receive(string from, string message)  
    290.         {  
    291.   
    292.             Console.Write("To a non-Beatle: ");  
    293.   
    294.             base.Receive(from, message);  
    295.  
    296.         }  
    297.   
    298.     }  


    五、中介者模式的优点


    1. 将系统按功能分割成更小的对象,符合类的最小设计原则

    2. 对关联对象的集中控制

    3. 减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则 ,而Mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)。

    4. 有利于提高类的重用性