职责链模式简单介绍
2013-12-12 17:33
316 查看
在机房收费系统合作中,我们用到了职责链模式。在这次合作中争论最大的就是职责链模式和状态模式。职责链模式和状态模式想必大家都很了解。由于是菜鸟,所以认识并不深刻,但是每一次讨论都会让自己对知识点的了解更近一步。在前一篇文章中,已经对状态模式进行了介绍, 下面将来介绍职责链模式的使用。
就我个人而言,职责链模式之所以被称作是职责链模式,那么最重要的就应该是链条的作用,那么什么是链呢?
一、链
链就是指每个节点都有若干个指针指向其他节点或从其他节点指向该节点的指针。
二、职责链模式
职责链模式主要是用来处理“客户端发出一个请求,有多个对象都有机会来处理这一个请求,但是客户端不知道究竟谁会来处理他的请求”,在职责链模式的层次结构中,每个对象都有一个对下一个对象的引用,这样形成一条链,这个请求就是在这条链中进行传递。当请求到来的时候,由每个具体处理子类根据请求的类型判断自己是否能处理该请求,如果能处理则进行处理,如果不能处理则把责任转交给别人。也就是说,每个具体的处理子类职责分明,每个人只负责好自己的那一份职责就可以,别的都不需要管。
职责链模式由两部分组成:一是处理请求的借口,一个是具体处理的类。
三、请假示例
假如按以下方式请假:
请假时间小于2h由组长进行处理
请假时间大于2h 小于半天由纪委处理
请假时间大于半天以上的由米老师尽心处理
代码如下:
客户端调用:
四、与状态模式的区别
职责链模式与状态模式有两个最大的区别,一个就是状态模式是负责处理自己内部的状态,也就是说状态模式的各个子状态是从一个类中独立出去,负责判断内部状态。而职责链模式是负责处理外部请求。
状态模式和职责链模式在设置上一级的问题上是不同的。状态模式在设计阶段设计下一级,不能在客户端改变。而职责链模式是在客户端阶段确定好了下一级。
五、职责链模式的好处:
降低耦合度,接收者和发送者没有对方的明确信息,且链中的对象也并不知道链的结构,每个职责只需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。
扩展灵活性,可以通过运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。
六、请求一定会被处理吗?
在职责链模式中,请求不一定会被处理,因为每个处理子类只包括这两个,一个是处理,另外是推卸责任,将处理转交个下一个,它并不管下一个处理对象是否能处理。而客户端也并不知道内部的处理过程,这样造成的结果就是,请求传递到最后一个处理对象时,可能都没有一个合适的对象进行处理。
就我个人而言,职责链模式之所以被称作是职责链模式,那么最重要的就应该是链条的作用,那么什么是链呢?
一、链
链就是指每个节点都有若干个指针指向其他节点或从其他节点指向该节点的指针。
二、职责链模式
职责链模式主要是用来处理“客户端发出一个请求,有多个对象都有机会来处理这一个请求,但是客户端不知道究竟谁会来处理他的请求”,在职责链模式的层次结构中,每个对象都有一个对下一个对象的引用,这样形成一条链,这个请求就是在这条链中进行传递。当请求到来的时候,由每个具体处理子类根据请求的类型判断自己是否能处理该请求,如果能处理则进行处理,如果不能处理则把责任转交给别人。也就是说,每个具体的处理子类职责分明,每个人只负责好自己的那一份职责就可以,别的都不需要管。
职责链模式由两部分组成:一是处理请求的借口,一个是具体处理的类。
三、请假示例
假如按以下方式请假:
请假时间小于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
四、与状态模式的区别
职责链模式与状态模式有两个最大的区别,一个就是状态模式是负责处理自己内部的状态,也就是说状态模式的各个子状态是从一个类中独立出去,负责判断内部状态。而职责链模式是负责处理外部请求。
状态模式和职责链模式在设置上一级的问题上是不同的。状态模式在设计阶段设计下一级,不能在客户端改变。而职责链模式是在客户端阶段确定好了下一级。
五、职责链模式的好处:
降低耦合度,接收者和发送者没有对方的明确信息,且链中的对象也并不知道链的结构,每个职责只需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。
扩展灵活性,可以通过运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。
六、请求一定会被处理吗?
在职责链模式中,请求不一定会被处理,因为每个处理子类只包括这两个,一个是处理,另外是推卸责任,将处理转交个下一个,它并不管下一个处理对象是否能处理。而客户端也并不知道内部的处理过程,这样造成的结果就是,请求传递到最后一个处理对象时,可能都没有一个合适的对象进行处理。
相关文章推荐
- 简单介绍GUI设计模式(MVP)
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍
- MVP模式 简单介绍
- 关于严格模式的简单介绍
- Objective-C 装饰模式--简单介绍和使用
- 简单介绍一下 设计模式在android中运用
- iOS设计模式之KVO Key-Value Observing 键值观察者模式的简单实用和介绍
- 安卓学习笔记---Android MVP 模式 简单易懂的介绍方式
- 设计模式简单介绍(Java语言)-- 工厂方法模式
- 设计模式简单介绍(java语言)-- 单例模式
- Javascript oop设计模式 面向对象编程简单实例介绍
- 简单介绍一下solr的几种应用模式
- MVP 模式简单易懂的介绍方式
- Android开发模式之MVC,MVP和MVVM的简单介绍与区别
- 关于保护模式的简单介绍(转)
- 简单介绍GUI设计模式(MVP)
- android MVP模式简单介绍
- 简单介绍一下水晶报表的推与拉两种模式
- 简单介绍PHP的责任链编程模式
- TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍