设计模式利剑10-责任链模式

来源:互联网 发布:ubuntu 停止图形界面 编辑:程序博客网 时间:2024/05/16 05:15
 

定      义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合,将这些对象连成一条链,并沿着这条链传递该请求,

             直到有对象处理它为止

优      点:将请求和处理分开,请求者可以不知道是谁处理的,处理者不用知道请求的全貌,两者解耦,提高了灵活性,责任链模式减低了请求

               的发送端和接收端之间的耦合,使多个对象有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。链的拓扑结构可

               以是单连通的或多连通的,责任链模式并不指定责任链的拓扑结构。但是责任链模式要求在同一时间里,命令只可以被传给一个下家

              (或被处理掉),而不可以传给多于一个下家。

缺      点:性能会收到一定的影响,因为每次都要从头传到尾才行

使用环境:

           1.系统已经有一个由处理者对象组成的链。这个链可能由合成模式给出。

           2.有多于一个的处理者对象会处理一个请求,而且事先并不知道到底由哪一个处理者对象处理一个请求。这个处理者对象是动态确定

           3.系统想发出一个请求给多个处理者对象中的某一个,但是不明确指定是哪一个处理者对象会处理此请求。

          4.处理一个请求的处理者对象集合需要动态地指定时。

理    解:在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。

应用案例:

           先来看看这个责任链模式的UML图:

image

            再来看看这个图的具体解释:

            抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。

           具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于处理者持有下家引用,因此,如果需要,具体处理者可以访问下家。

            再来看一个我们实际生活中的例子:员工请假,部门经理可以批3天以下的假期,中心总监可批5天以下的假期,副总裁可批10天以下的假期,CEO可以批20天以下假期,超过20天需要开会决定,首先这个审批时有一个流程的,一个基层员工要请假,首先他并不知道这个原则,首先他得去咨询相关人员这个请假规定,然后根据规定来找相关的人,这样对员工来讲非常的苦闷,如果要请20天,那么还得去找CEO,可是CEO并不认识我,这个假还怎么请呢?那么我们使用责任链模式,让员工不再为请假而烦恼,设计的UML图如下:

image

 

view plaincopy to clipboardprint?
  1. Public MustInherit Class Handle  
  2.   
  3.     Private nextHandle As Handle = Nothing  
  4.     Public Shared FATHER_LEVEL_REQUEST As Integer = 1  
  5.     Public Shared HUSBAND_LEVEL_REQUEST As Integer = 2  
  6.     Public Shared SON_LEVEL_REQUEST As Integer = 3  
  7.     Private _level As Integer = 0  
  8.     '''    
  9.     ''' <param name="_women"></param>  
  10.     Public Sub HandleMessage(ByVal _women As IWomen)  
  11.         If _women.getType1 = _level Then  
  12.             response(_women)  
  13.         Else  
  14.             If nextHandle Is Nothing Then  
  15.                 Console.WriteLine("无法做出指示,按不同意处理")  
  16.             Else  
  17.                 nextHandle.HandleMessage(_women)  
  18.             End If  
  19.         End If  
  20.     End Sub  
  21.     '''    
  22.     ''' <param name="_women"></param>   
  23.     Protected MustOverride Sub response(ByVal _women As IWomen)  
  24.     '''    
  25.     ''' <param name="__level"></param>  
  26.     Public Sub New(ByVal __level As Integer)  
  27.         _level = __level  
  28.     End Sub  
  29.     Public Sub SetNext(ByVal _nextHandle As Handle)  
  30.         nextHandle = _nextHandle  
  31.     End Sub  
  32. End Class ' Handle  
  33. Public Class Father  
  34.     Inherits Handle  
  35.     '''    
  36.     ''' <param name="_women"></param>   
  37.     Protected Overrides Sub response(ByVal _women As IWomen)  
  38.         Console.WriteLine("女儿向父亲请示")  
  39.         Console.WriteLine(_women.getRequest())  
  40.         Console.WriteLine("父亲对女儿的答复是:同意")  
  41.     End Sub  
  42.     Public Sub New()  
  43.         MyBase.New(Handle.FATHER_LEVEL_REQUEST)  
  44.     End Sub  
  45. End Class ' Father  
  46. Public Class Husband  
  47.     Inherits Handle  
  48.     '''    
  49.     ''' <param name="_women"></param>  
  50.     Protected Overrides Sub response(ByVal _women As IWomen)  
  51.         Console.WriteLine("妻子向丈夫请示")  
  52.         Console.WriteLine(_women.getRequest)  
  53.         Console.WriteLine("丈夫的请示是:同意")  
  54.     End Sub  
  55.     Public Sub new()  
  56.         MyBase.New(Handle.HUSBAND_LEVEL_REQUEST)  
  57.     End Sub  
  58. End Class ' Husband  
  59. Public Class Son  
  60.     Inherits Handle  
  61.     '''    
  62.     ''' <param name="_women"></param>   
  63.     Protected Overrides Sub response(ByVal _women As IWomen)  
  64.         Console.WriteLine("母亲向儿子请示")  
  65.         Console.WriteLine(_women.getRequest)  
  66.         Console.WriteLine("儿子对母亲的回复是:同意")  
  67.     End Sub  
  68.     Public Sub new()  
  69.         MyBase.New(Handle.SON_LEVEL_REQUEST)  
  70.     End Sub  
  71. End Class ' Son  
  72. Public MustInherit Class IWomen  
  73.     Public MustOverride Function getType1() As Integer  
  74.     Public MustOverride Function getRequest() As String  
  75. End Class ' IWomen  
  76. Public Class Women  
  77.     Inherits IWomen  
  78.     Private type As Integer = 0  
  79.     Private request As String = ""  
  80.     Public Overrides Function getType1() As Integer  
  81.         Return type  
  82.     End Function  
  83.     Public Overrides Function getRequest() As String  
  84.         Return request  
  85.     End Function  
  86.     '''    
  87.     ''' <param name="_type"></param>  
  88.     ''' <param name="_request"></param>   
  89.     Public Sub new(ByVal _type As IntegerByVal _request As String)  
  90.         type = _type  
  91.         request = _request  
  92.     End Sub  
  93. End Class ' Women  
  94. Module Client  
  95.     Sub Main()  
  96.         Dim father As Handle = New Father()  
  97.         Dim husband As Handle = New Husband  
  98.         Dim son As Handle = New Son  
  99.         father.SetNext(husband)  
  100.         husband.SetNext(son)  
  101.         Dim _nver As IWomen = New Women(1, "我要出去上学")  
  102.         Dim _qizi As IWomen = New Women(2, "我要出去逛街")  
  103.         Dim _mama As IWomen = New Women(3, "我要出去买菜")  
  104.         father.HandleMessage(_nver)  
  105.         father.HandleMessage(_qizi)  
  106.         father.HandleMessage(_mama)  
  107.         Console.Read()  
  108.     End Sub  
  109. End Module  

原创粉丝点击