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

  • 相关阅读:
    Apache 安装后Error 403的故障排错方法(linux)
    ab接口压力测试工具使用
    php工具、拓展下载地址
    Jboss反序列化漏洞复现(CVE-2017-12149)
    Apache SSI 远程命令执行漏洞复现
    apache httpd多后缀解析漏洞复现
    IIS短文件名漏洞复现
    nginx文件名逻辑漏洞_CVE-2013-4547漏洞复现
    nginx CRLF(换行回车)注入漏洞复现
    nginx目录穿越漏洞复现
  • 原文地址:https://www.cnblogs.com/baxianhua/p/11141861.html
Copyright © 2011-2022 走看看