就我个人而言,职责链模式之所以被称作是职责链模式,那么最重要的就应该是链条的作用,那么什么是链呢?
一、链
链就是指每个节点都有若干个指针指向其他节点或从其他节点指向该节点的指针。
二、职责链模式
职责链模式主要是用来处理“客户端发出一个请求,有多个对象都有机会来处理这一个请求,但是客户端不知道究竟谁会来处理他的请求”,在职责链模式的层次结构中,每个对象都有一个对下一个对象的引用,这样形成一条链,这个请求就是在这条链中进行传递。当请求到来的时候,由每个具体处理子类根据请求的类型判断自己是否能处理该请求,如果能处理则进行处理,如果不能处理则把责任转交给别人。也就是说,每个具体的处理子类职责分明,每个人只负责好自己的那一份职责就可以,别的都不需要管。 职责链模式由两部分组成:一是处理请求的借口,一个是具体处理的类。
三、请假示例
假如按以下方式请假:
代码如下:
''' <summary>''' 定义请求类''' </summary>''' <remarks></remarks>Public Class RequestPrivate day As IntegerPublic Property ProDay() As IntegerGetReturn dayEnd GetSet(value As Integer)day = valueEnd SetEnd PropertyPrivate reason As StringPublic Property ProReason() As StringGetReturn reasonEnd GetSet(value As String)reason = valueEnd SetEnd PropertyPublic Function Request(ByVal day As Integer, ByVal reason As String)Me.day = ason = reasonEnd FunctionEnd Class''' <summary>''' 定义抽象管理的抽象类''' </summary>''' <remarks>朱火云 2013-12-12 11:25:30</remarks>Public MustInherit Class ManagerProtected name As StringProtected superior As ManagerPublic Sub New(ByVal name As String)Me.name = nameEnd SubPublic Sub SetSuperior(ByVal superior As Manager)Me.superior = superiorEnd SubPublic MustOverride Function Passquest(ByVal request As Request)End Class''' <summary>''' 具体处理子类(组长)''' </summary>''' <remarks>朱火云 2013-12-12 16:35:34</remarks>Public Class headman : Inherits ManagerPublic Sub New(ByVal name As String)MyBase.New(name)End SubPublic Overrides Function Passquest(request As Request)Dim day As Integerday = request.ProDayDim reason As Stringreason = request.ProReasonIf (day <= 0.2) ThenReturn TrueEnd IfReturn superior.Passquest(request) '其余的申请转到上级End FunctionEnd Class''' <summary>''' 具体处理子类(纪委)''' </summary>''' <remarks></remarks>Public Class jiwei : Inherits ManagerPublic Sub New(ByVal name As String)MyBase.New(name)End SubPublic Overrides Function Passquest(request As Request)Dim day As Integerday = request.ProDayDim reason As Stringreason = request.ProReasonIf (day <= 0.2) ThenReturn TrueEnd IfReturn superior.Passquest(request) '其余的申请转到上级End FunctionEnd Class''' <summary>''' 具体处理子类(米老师) ''' </summary>''' <remarks>2013-12-12 16:37:02</remarks>Public Class MrLi : Inherits ManagerPublic Sub New(ByVal name As String)MyBase.New(name)End SubPublic Overrides Function Passquest(request As Request)Dim day As Integerday = request.ProDayDim reason As Stringreason = request.ProReasonIf (reason = "正当理由") ThenReturn TrueEnd IfReturn FalseEnd FunctionEnd Class
客户端调用:
Sub Main()Dim request As New Requestrequest.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 Booleanpass = headman.Passquest(request)Console.Write("pass")End Sub
职责链模式与状态模式有两个最大的区别,一个就是状态模式是负责处理自己内部的状态,也就是说状态模式的各个子状态是从一个类中独立出去,负责判断内部状态。而职责链模式是负责处理外部请求。
状态模式和职责链模式在设置上一级的问题上是不同的。状态模式在设计阶段设计下一级,不能在客户端改变。而职责链模式是在客户端阶段确定好了下一级。
五、职责链模式的好处:
六、请求一定会被处理吗?
在职责链模式中,请求不一定会被处理,因为每个处理子类只包括这两个,一个是处理,另外是推卸责任,将处理转交个下一个,它并不管下一个处理对象是否能处理。而客户端也并不知道内部的处理过程,这样造成的结果就是,请求传递到最后一个处理对象时,可能都没有一个合适的对象进行处理。
本文发布于:2024-01-28 11:56:09,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064141737245.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |