设计模式利剑8-中介者模式

来源:互联网 发布:java最有名的论坛 编辑:程序博客网 时间:2024/04/29 20:30
 

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

             之间的交互。

优    点:减少了类之间的相互依赖,把原有的一对多的依赖变成了一对一的依赖,同事类只依赖中间者,减少了依赖,当然也减少了类见耦合

缺    点:随着业务流程的复杂,中介者会膨胀很大,而且逻辑复杂

动    机:在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

Mediator模式的几个要点:

      将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。  随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。 Façade模式是解耦系统外到系统内(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系,先来看一看中介者模式的类图结构:

image        中介者模式应用场景特别多,举例子:一个公司又很多的部门,每个部门之间都会有沟通,这样会导致部门与部门之间的耦合度非常高,关系非常的复杂,而且有时候一件事情需要找多个部门去协调,那么这个时候引入一个中间机构,部门协调处理机构,部门之间的沟通只要找中介者即可。以我们现在公司来说,有销售部门,有资源管理部门,有运营部门,这三个部门之间经常会存在矛盾,一个问题经常在部门之间沟通来沟通去,最后还解决不了,现在引入由CEO亲自组建的中介者团队,专门负责部门之间的关系,这样这个部门之间打架的关系就少了!可见中介者的力量还是很强大的,虽然增加了人力成本,但是解决了企业流程复杂,使得工作效率更好!

image        再来看一个必须要有中介者模式介入的案例,机场调度中心,每一辆飞机的起飞和降落都必须得首先得到机场调度中的许可,而调度中心则根据复杂的情况来判断,包括从国家部门获得航空管制的信息,从而返回飞机是否可以起飞的指令,如果都让每架飞机自己沟通,那问题在那里?我的飞机要着陆了,我先要咨询有那条跑到是空的,如果没有空的,我要通知跑到上的飞机,赶紧让开,如果实在没位置了,是否要在空中等待一会,看那辆飞机要起飞,于是我要一个一个的咨询,想想这个难度有多复杂,要是将这个类间关系用UML描述出来,这是多么的恐怖的事情,蜘蛛网让每一个看到的人绝对崩溃,现在好了,有机场调度中心了,我们来看看机场时怎么在调度中心的配置之下如何正常运转吧。

image      再想想如果没有这个调度中心,飞机起飞和降落那是一件多么大的工程!另外,中介者模式在日常生活中到处可见,如二手房地产市场,房东要出售房子,而买主要购买房子,这个时候中介机构就显然非常的重要了。再想一想,现在中国男女比率越来越失去平衡,很多男性朋友找女朋友已经成了一个问题,甚至于有一些人开始寻找越南等不发达国家的女人来做老婆了,而现在男人要求也高,女人也是,这是一个相互的选择过程。不可能随便找一个人就娶了,那么久要到处去咨询女人,问:你愿意嫁给我吗?,女人回答:愿意或者不愿意,也许是神经病。问一次两次行,那么问多了,你不会觉得郁闷吗?那这样好了,我直接去婚姻介绍所,将个人要求说给介绍所听,介绍所帮忙查找符合条件的女人,然后去咨询,那么去咨询的人就不用很复杂了,得到的结果就是行还是不行,多简单省事。画一个UML图如下:image

 

view plaincopy to clipboardprint?
  1. Public MustInherit Class AbstractMediator  
  2.   
  3.     Protected m_Purchage As Purchase  
  4.     Protected m_Sale As Sale  
  5.     Protected m_Stock As Stock  
  6.   
  7.     Public Property Purchage() As Purchase  
  8.         Get  
  9.             Return m_Purchage  
  10.         End Get  
  11.         Set(ByVal Value as Purchase)  
  12.             m_Purchage = Value  
  13.         End Set  
  14.     End Property  
  15.     Public Property Sale() As Sale  
  16.         Get  
  17.             Return m_Sale  
  18.         End Get  
  19.         Set(ByVal Value as Sale)  
  20.             m_Sale = Value  
  21.         End Set  
  22.     End Property  
  23.     Public Property Stock() As Stock  
  24.         Get  
  25.             Return m_Stock  
  26.         End Get  
  27.         Set(ByVal Value as Stock)  
  28.             m_Stock = Value  
  29.         End Set  
  30.     End Property  
  31.   
  32. End Class ' AbstractMediator  
  33.   
  34. Public Class Mediator  
  35.     Inherits AbstractMediator  
  36.   
  37.     Public Sub New()  
  38.         MyBase.New()  
  39.     End Sub  
  40.     Public Sub buyComputer(ByVal numbers As Integer)  
  41.         Dim salestatus As Integer = MyBase.m_Sale.getSaleStatus  
  42.         If salestatus > 80 Then  
  43.             Console.WriteLine("采购IBM电脑:" & numbers & "台")  
  44.             MyBase.m_Stock.increase(numbers)  
  45.         End If  
  46.     End Sub  
  47.     Public Sub sellComputer(ByVal numbers As Integer)  
  48.         Console.WriteLine("销售IBM电脑数:" & numbers & "台")  
  49.         MyBase.m_Stock.decrease(numbers)  
  50.     End Sub  
  51.     Public Sub offSell()  
  52.         Console.WriteLine("折价销售IBM电脑" & MyBase.m_Stock.getStockNumber & "台")  
  53.     End Sub  
  54. End Class ' Mediator  
  55. Public MustInherit Class AbstractColleague  
  56.   
  57.     Protected m_mediator As AbstractMediator  
  58.     '''    
  59.     ''' <param name="_mediator"></param>  
  60.     Public Sub New(ByVal _mediator As AbstractMediator)  
  61.         m_mediator = _mediator  
  62.     End Sub  
  63.   
  64. End Class ' AbstractColleague  
  65. Public Class Purchase  
  66.     Inherits AbstractColleague  
  67.     '''    
  68.     ''' <param name="_mediator"></param>   
  69.     Public Sub New(ByVal _mediator As AbstractMediator)  
  70.         MyBase.New(_mediator)  
  71.     End Sub  
  72.     '''    
  73.     ''' <param name="numbers"></param>  
  74.     Public Sub buyIBMcomputer(ByVal numbers As Integer)  
  75.         CType(MyBase.m_mediator, Mediator).buyComputer(numbers)  
  76.     End Sub  
  77.     Public Sub refuseBuyIBM()  
  78.         Console.WriteLine("不再采购IBM电脑")  
  79.     End Sub  
  80. End Class ' Purchase  
  81. Public Class Sale  
  82.     Inherits AbstractColleague  
  83.   
  84.     '''    
  85.     ''' <param name="_mediator"></param>  
  86.     Public Sub New(ByVal _mediator As AbstractMediator)  
  87.         MyBase.New(_mediator)  
  88.     End Sub  
  89.     '''    
  90.     ''' <param name="numbers"></param>   
  91.     Public Sub sellIBMComputer(ByVal numbers As Integer)  
  92.         CType(MyBase.m_mediator, Mediator).sellComputer(numbers)  
  93.         Console.WriteLine("销售IBM电脑" & numbers & "台")  
  94.     End Sub  
  95.     Public Function getSaleStatus() As Integer  
  96.         Return 100  
  97.     End Function  
  98.     Public Sub offSale()  
  99.         CType(MyBase.m_mediator, Mediator).offSell()  
  100.     End Sub  
  101.   
  102. End Class ' Sale  
  103.   
  104. Public Class Stock  
  105.     Inherits AbstractColleague  
  106.   
  107.     Private COMPUTER_NUMBER As Integer = 100  
  108.     '''    
  109.     ''' <param name="_mediator"></param>  
  110.     Public Sub New(ByVal _mediator As AbstractMediator)  
  111.         MyBase.New(_mediator)  
  112.     End Sub  
  113.     '''    
  114.     ''' <param name="numbers"></param>   
  115.     Public Sub increase(ByVal numbers As Integer)  
  116.         COMPUTER_NUMBER = COMPUTER_NUMBER + numbers  
  117.         Console.WriteLine("现在库存数量为:" & COMPUTER_NUMBER)  
  118.     End Sub  
  119.     '''    
  120.     ''' <param name="numbers"></param>   
  121.     Public Sub decrease(ByVal numbers As Integer)  
  122.         COMPUTER_NUMBER = COMPUTER_NUMBER - numbers  
  123.         Console.WriteLine("现在库存数量为:" & COMPUTER_NUMBER)  
  124.     End Sub  
  125.     Public Function getStockNumber() As Integer  
  126.         Return COMPUTER_NUMBER  
  127.     End Function  
  128.     Public Sub clearStock()  
  129.         CType(MyBase.m_mediator, Mediator).offSell()  
  130.     End Sub  
  131.   
  132. End Class ' Stock  
  133. Module Client  
  134.     Sub Main()  
  135.         Dim _mediator As Mediator = New Mediator  
  136.         Dim _purchase As Purchase = New Purchase(_mediator)  
  137.         Dim _sale As Sale = New Sale(_mediator)  
  138.         Dim _stock As Stock = New Stock(_mediator)  
  139.         _mediator.Purchage = _purchase  
  140.         _mediator.Sale = _sale  
  141.         _mediator.Stock = _stock  
  142.         _purchase.buyIBMcomputer(100)  
  143.         _sale.sellIBMComputer(10)  
  144.         _stock.clearStock()  
  145.         Console.Read()  
  146.     End Sub  
  147. End Module  

原创粉丝点击