您的位置:首页 > 其它

职责链模式简单介绍

2013-12-12 17:33 316 查看
   在机房收费系统合作中,我们用到了职责链模式。在这次合作中争论最大的就是职责链模式和状态模式。职责链模式和状态模式想必大家都很了解。由于是菜鸟,所以认识并不深刻,但是每一次讨论都会让自己对知识点的了解更近一步。在前一篇文章中,已经对状态模式进行了介绍, 下面将来介绍职责链模式的使用。 
   就我个人而言,职责链模式之所以被称作是职责链模式,那么最重要的就应该是链条的作用,那么什么是链呢? 

 一、链

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

二、职责链模式

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


 

三、请假示例

   假如按以下方式请假: 

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

代码如下: 

''' <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


四、与状态模式的区别


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

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

五、职责链模式的好处: 

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

   在职责链模式中,请求不一定会被处理,因为每个处理子类只包括这两个,一个是处理,另外是推卸责任,将处理转交个下一个,它并不管下一个处理对象是否能处理。而客户端也并不知道内部的处理过程,这样造成的结果就是,请求传递到最后一个处理对象时,可能都没有一个合适的对象进行处理。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: