职责链模式简单介绍

   在机房收费系统合作中,我们用到了职责链模式。在这次合作中争论最大的就是职责链模式和状态模式。职责链模式和状态模式想必大家都很了解。由于是菜鸟,所以认识并不深刻,但是每一次讨论都会让自己对知识点的了解更近一步。在前一篇文章中,已经对状态模式进行了介绍, 下面将来介绍职责链模式的使用。 

   就我个人而言,职责链模式之所以被称作是职责链模式,那么最重要的就应该是链条的作用,那么什么是链呢? 

 一、链

   链就是指每个节点都有若干个指针指向其他节点或从其他节点指向该节点的指针。


二、职责链模式

   职责链模式主要是用来处理“客户端发出一个请求,有多个对象都有机会来处理这一个请求,但是客户端不知道究竟谁会来处理他的请求”,在职责链模式的层次结构中,每个对象都有一个对下一个对象的引用,这样形成一条链,这个请求就是在这条链中进行传递。当请求到来的时候,由每个具体处理子类根据请求的类型判断自己是否能处理该请求,如果能处理则进行处理,如果不能处理则把责任转交给别人。也就是说,每个具体的处理子类职责分明,每个人只负责好自己的那一份职责就可以,别的都不需要管。 职责链模式由两部分组成:一是处理请求的借口,一个是具体处理的类。

 

三、请假示例

   假如按以下方式请假: 

  1. 请假时间小于2h由组长进行处理
  2. 请假时间大于2h 小于半天由纪委处理
  3. 请假时间大于半天以上的由米老师尽心处理


代码如下: 

''' <summary>
    ''' 定义请求类
    ''' </summary>
    ''' <remarks></remarks>
    Public Class Request
        Private day As Integer
        Public Property ProDay() As Integer
            Get
                Return day
            End Get
            Set(value As Integer)
                day = value
            End Set
        End Property

        Private reason As String
        Public Property ProReason() As String
            Get
                Return reason
            End Get
            Set(value As String)
                reason = value
            End Set
        End Property

        Public Function Request(ByVal day As Integer, ByVal reason As String)
            Me.day = day
            Me.reason = reason
        End Function
    End Class
    ''' <summary>
    ''' 定义抽象管理的抽象类
    ''' </summary>
    ''' <remarks>朱火云 2013-12-12 11:25:30</remarks>
    Public MustInherit Class Manager
        Protected name As String
        Protected superior As Manager
        Public Sub New(ByVal name As String)
            Me.name = name
        End Sub
        Public Sub SetSuperior(ByVal superior As Manager)
            Me.superior = superior
        End Sub
        Public MustOverride Function Passquest(ByVal request As Request)
    End Class

    ''' <summary>
    ''' 具体处理子类(组长)
    ''' </summary>
    ''' <remarks>朱火云  2013-12-12 16:35:34</remarks>
    Public Class headman : Inherits Manager

        Public Sub New(ByVal name As String)
            MyBase.New(name)
        End Sub
        Public Overrides Function Passquest(request As Request)
            Dim day As Integer
            day = request.ProDay
            Dim reason As String
            reason = request.ProReason
            If (day <= 0.2) Then
                Return True
            End If
            Return superior.Passquest(request)             '其余的申请转到上级
        End Function
    End Class


    ''' <summary>
    ''' 具体处理子类(纪委)
    ''' </summary>
    ''' <remarks></remarks>
    Public Class jiwei : Inherits Manager

        Public Sub New(ByVal name As String)
            MyBase.New(name)
        End Sub
        Public Overrides Function Passquest(request As Request)
            Dim day As Integer
            day = request.ProDay
            Dim reason As String
            reason = request.ProReason
            If (day <= 0.2) Then
                Return True
            End If
            Return superior.Passquest(request)      '其余的申请转到上级
        End Function
    End Class


    ''' <summary>
    ''' 具体处理子类(米老师) 
    ''' </summary>
    ''' <remarks>2013-12-12 16:37:02</remarks>
    Public Class MrLi : Inherits Manager

        Public Sub New(ByVal name As String)
            MyBase.New(name)
        End Sub
        Public Overrides Function Passquest(request As Request)
            Dim day As Integer
            day = request.ProDay
            Dim reason As String
            reason = request.ProReason
            If (reason = "正当理由") Then
                Return True
            End If
            Return False
        End Function
    End Class

客户端调用: 

Sub Main()
        Dim request As New Request
        request.Request(3, "正当理由")
        Dim headman As headman = New headman("朱火云")
        Dim jiwei As jiwei = New jiwei("李亚光")
        Dim MrLi As MrLi = New MrLi("米老师")
        headman.SetSuperior(jiwei)             '由客户端指定上级
        jiwei.SetSuperior(MrLi)
        Dim pass As Boolean
        pass = headman.Passquest(request)
        Console.Write("pass")
    End Sub

四、与状态模式的区别

   职责链模式与状态模式有两个最大的区别,一个就是状态模式是负责处理自己内部的状态,也就是说状态模式的各个子状态是从一个类中独立出去,负责判断内部状态。而职责链模式是负责处理外部请求。

状态模式和职责链模式在设置上一级的问题上是不同的。状态模式在设计阶段设计下一级,不能在客户端改变。而职责链模式是在客户端阶段确定好了下一级。


五、职责链模式的好处: 

  1. 降低耦合度,接收者和发送者没有对方的明确信息,且链中的对象也并不知道链的结构,每个职责只需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。 
  2. 扩展灵活性,可以通过运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。 

六、请求一定会被处理吗? 
   在职责链模式中,请求不一定会被处理,因为每个处理子类只包括这两个,一个是处理,另外是推卸责任,将处理转交个下一个,它并不管下一个处理对象是否能处理。而客户端也并不知道内部的处理过程,这样造成的结果就是,请求传递到最后一个处理对象时,可能都没有一个合适的对象进行处理。 

你可能感兴趣的:(职责链模式简单介绍)