职责链模式简单介绍

阅读: 评论:0

职责链模式简单介绍

职责链模式简单介绍

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

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

 一、链

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


二、职责链模式

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

 

三、请假示例

   假如按以下方式请假: 

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


代码如下: 

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

四、与状态模式的区别

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

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


五、职责链模式的好处: 

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

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

本文发布于:2024-01-28 11:56:09,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064141737245.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:职责   模式   简单
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23