读书笔记20:中介者模式

来源:互联网 发布:ubuntu鼠标指针主题 编辑:程序博客网 时间:2024/05/29 10:00

1、 定义:用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示地相互引用,从而使其耦合松散而且可以独立地改变它们之间的交互。
    中介者减少了各个同事对象的耦合,使得可以独立地改变和复用各个同事对象和中介者类;由于把对想如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏伟的角度去考虑系统。
2、角色
Mediator——中介,其它类的互相访问,通过这个来实现。
Colleage——需要通信的类。
3、模型

抽象的两个角色。

[csharp] view plaincopyprint?
  1. public abstract class Mediator  
  2. {  
  3.     public abstract void Send(string message,Colleage colleage);  
  4. }  
  5.   
  6. public abstract class Colleage  
  7. {  
  8.     protected Mediator mediator;  
  9.   
  10.     public Colleage(Mediator mediator)  
  11.     {  
  12.         this.mediator = mediator;  
  13.     }  
  14. }  

中介类。需要通信的类在这里完成操作,避免了类之间互相引用。

[csharp] view plaincopyprint?
  1. public class CreateMediator : Mediator  
  2. {  
  3.     private CreateColleage1 colleage1;  
  4.   
  5.     private CreateColleage2 colleage2;  
  6.   
  7.     public CreateColleage1 Colleage1  
  8.     {  
  9.         set   
  10.         {   
  11.             colleage1 = value;   
  12.         }  
  13.     }  
  14.   
  15.     public CreateColleage2 Colleage2  
  16.     {  
  17.         set   
  18.         {   
  19.             colleage2 = value;   
  20.         }  
  21.     }  
  22.   
  23.     public override void Send(string message, Colleage colleage)  
  24.     {  
  25.         if (colleage == colleage1)  
  26.         {  
  27.             colleage2.Notify(message);  
  28.         }  
  29.         else  
  30.         {  
  31.             colleage1.Notify(message);  
  32.         }  
  33.     }  
  34. }  

需要相互操作的类。

[csharp] view plaincopyprint?
  1. public class CreateColleage1:Colleage  
  2. {  
  3.     public CreateColleage1(Mediator mediator)  
  4.   
  5.         : base(mediator)  
  6.     {  
  7.   
  8.     }  
  9.   
  10.     public void Send(string message)  
  11.     {  
  12.         mediator.Send(message, this);  
  13.     }  
  14.   
  15.     public void Notify(string message)  
  16.     {  
  17.         Console.WriteLine(string.Format(@"同事1得到信息:{0}", message));  
  18.     }  
  19. }  
  20.   
  21. public class CreateColleage2 : Colleage  
  22. {  
  23.     public CreateColleage2(Mediator mediator)  
  24.   
  25.         : base(mediator)  
  26.     {  
  27.   
  28.     }  
  29.   
  30.     public void Send(string message)  
  31.     {  
  32.         mediator.Send(message, this);  
  33.     }  
  34.   
  35.     public void Notify(string message)  
  36.     {  
  37.         Console.WriteLine(string.Format(@"同事2得到信息:{0}", message));  
  38.     }  
  39. }  

调用

[csharp] view plaincopyprint?
  1. static void Main()  
  2. {  
  3.     CreateMediator mediator = new CreateMediator();  
  4.   
  5.     CreateColleage1 colleage1 = new CreateColleage1(mediator);  
  6.   
  7.     CreateColleage2 colleage2 = new CreateColleage2(mediator);  
  8.   
  9.     mediator.Colleage1 = colleage1;  
  10.   
  11.     mediator.Colleage2 = colleage2;  
  12.   
  13.     colleage1.Send("吃了吗?");  
  14.   
  15.     colleage2.Send("没呢!");  
  16.   
  17.     Console.ReadLine();  
  18. }  

结果:

中介者模式,是为了避免类之间的耦合,该模式把类与类之间的相互引用或者调用,都交给中介来完成。如下面的例子。
有一个窗体,窗体上面是要显示和操作数据的,比如读取数据库的数据显示出来、读取设置的数据来完成一些功能。要如下实现。

[csharp] view plaincopyprint?
  1. public partial class Form1 : Form  
  2. {  
  3.     GetDataBaseData getDataBaseData;//读取数据库的类  
  4.   
  5.     GetSettingData getSettingData;//读取设置信息的类  
  6.   
  7.     public Form1()  
  8.     {  
  9.         InitializeComponent();  
  10.     }  
  11. }  
  12. public class GetDataBaseData  
  13. {  
  14.     //方法  
  15. }  
  16. public class GetSettingData  
  17. {  
  18.     //方法  
  19.  }  

    这样有一个问题,如果还有别的获取数据的类呢,岂不是要一直在Form1中增加定义?这不符合三层架构。这样,需要修改一下,增加一个窗口管理类,

[csharp] view plaincopyprint?
  1. public class Form1Manager  
  2. {  
  3.     GetDataBaseData getDataBaseData;//读取数据库的类  
  4.   
  5.     GetSettingData getSettingData;//读取设置信息的类  
  6.   
  7.     public object GetDataBaseData()   
  8.     {  
  9.         return "";  
  10.     }  
  11.   
  12.     public object GetSettingData()  
  13.     {  
  14.         return "";  
  15.     }  
  16. }  
  17. public partial class Form1 : Form  
  18. {  
  19.     Form1Manager form1Manager;  
  20.   
  21.     public Form1()  
  22.     {  
  23.         InitializeComponent();  
  24.     }  
  25. }  

    Form1不管要获取什么数据,都交给管理类去获取,Form1只关心结果,至于管理类的算法什么的,就不去管了。这样管理类就充当了中介的角色。降低了窗体和数据类之间的耦合程度。
    代码:http://download.csdn.net/detail/yysyangyangyangshan/4145501

0 0