zoukankan      html  css  js  c++  java
  • python 设计模式之 (Chain of Responsibility)责任链模式

    #写在前面

    对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的。所以弄明白很重要。

    等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场

    #责任链模式定义

    简书上一网友就把这个定义就说的挺清楚,下面有参考连接。明明简简单单的事情,百科上非要写的文绉绉的,很拗口,又晦涩

     责任链模式就是这种“推卸”责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象。至于到底谁解决了这个问题了呢?我管呢!

    # 责任链模式由两个角色组成:

    1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
    2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。

     # 应用实例

    1.红楼梦中的击鼓传花

    2.JS中的事件冒泡

    3.JAVA WEB中的Apache Tomcat对Encoding的处理

    4.Struts2d 的拦截器

    5.jsp servlet的filter,servlet中的filter
    6.dubbo中的filter
    7. mybatis中的plugin 这3个框架在实现责任链方式不尽相同。

    后面这些我也不太了解,

     #使用场景

    1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

    2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

    3、可动态指定一组对象处理请求。

    #优点

    1、降低耦合度。它将请求的发送者和接收者解耦。

    2、简化了对象。使得对象不需要知道链的结构。

    3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

    4、增加新的请求处理类很方便。

    #缺点

    1、不能保证请求一定被接收。

    2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

    3、可能不容易观察运行时的特征,有碍于除错。

     #举个栗子

    #经理类
    class Manager:
        
        successor=None
        name=''
    
        def __init__(self,name):
            self.name=name
    
        #设置上级  
        def setSuccessor(self,successor):
            self.successor=successor
            
        #处理请求
        def handleRequest(self,request):
            pass
        
    
    #直属经理
    class LineManager(Manager): 
        def handleRequest(self,request):
            if request.requestType=='little' :
                print('requestType: %s ,requestContent: %s,' %(request.requestType,request.requestContent))
                print('小事一桩,我这个小小的line manager就能搞定')
            else:
                if self.successor !=None:
                    print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))
                    print('非小事,我这个小小的line manager无能为力,交上级处理')
                    print('上级是:',self.successor)
                    self.successor.handleRequest(request)
    
    #部门经理
    class DepartmentManager(Manager):
        def handleRequest(self,request):
            if request.requestType=='middle' :
                print('requestType: %s ,requestContent: %s ' %(request.requestType,request.requestContent))
                print('中级事件,我这个department manager就能搞定')
            else:
                if  self.successor !=None:                
                    print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))
                    print('非中级事件,我这个department manager无能为力,交上级处理' )
                    print('上级是:',self.successor)
                    self.successor.handleRequest(request)
    
        def __str__(self):
            return 'Department Manager '
    
    #总经理
    class GeneralManager(Manager):
        def handleRequest(self,request):
            if request.requestType=='big' :
                print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))
                print('大事件,得由我这个 general manager拍板')
    
        def __str__(self):
            return 'General Manager '
    
    class Request():
        def __init__(self,requestType,requestContent):
            self.requestType=requestType
            self.requestContent=requestContent
    
        def commit(self,manager):
            ret=manager.handleRequest(self)
    
    
    if __name__=='__main__':
        line_manager=LineManager('Line Manager')
        department_manager=DepartmentManager('Department Manager')
        general_manager=GeneralManager('General Manager')
        line_manager.setSuccessor(department_manager)
        department_manager.setSuccessor(general_manager)
    
        print('==========================================================')
        request=Request('little','请批准团队外出腐败经费1000元')
        request.commit(line_manager)
    
        print('==========================================================')
        request=Request('middle','请批准团队外出旅游10000元')
        request.commit(line_manager)
    
        print('==========================================================')
        request=Request('big','请批准团队设备购买100000元')
        request.commit(line_manager)

     

      例子是我参考了csdn上的一篇博客(链接参考下面),我按照自己的理解,做了些更改,如发现错误之处,请留言更正,thanks。

    参考

    https://blog.csdn.net/baidu_15113429/article/details/85760002

    https://www.jianshu.com/p/75946acd80e3

    https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html

    https://zhidao.baidu.com/question/268801834417526925.html

    https://www.cnblogs.com/z-test/p/9319116.html

    https://www.cnblogs.com/chenpi/p/5217038.html

  • 相关阅读:
    XAML学习笔记之Layout(五)——ViewBox
    XAML学习笔记——Layout(三)
    XAML学习笔记——Layout(二)
    XAML学习笔记——Layout(一)
    从0开始搭建SQL Server 2012 AlwaysOn 第三篇(安装数据,配置AlwaysOn)
    从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)
    从0开始搭建SQL Server 2012 AlwaysOn 第一篇(AD域与DNS)
    Sql Server 2012 事务复制遇到的问题及解决方式
    Sql Server 2008R2升级 Sql Server 2012 问题
    第一次ACM
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11141861.html
Copyright © 2011-2022 走看看