zoukankan      html  css  js  c++  java
  • 职责链模式

    意图:
    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
     
    适用性:
    有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    可处理一个请求的对象集合应被动态指定。
     
    代码示例:
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    '''
    Chain of Responsibility
    '''
    # 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,
    # 并沿着这条链传递该请求,直到有一个对象处理它为止。
    # 适用场景:
    # 1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;
    # 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;
    # 3、处理一个请求的对象集合应被动态指定。
     
    class BaseHandler(object):
        '''处理基类'''
        def successor(self,successor): #next_handler
            #与下一个责任者关联
            self._successor = successor
     
    class RequestHandlerL1(BaseHandler):
        '''第一级请求处理者'''
        name = "TeamLeader"
        def handle(self,request):
            if request < 500 :
                print("审批者[%s],请求金额[%s],审批结果[审批通过]"%(self.name,request))
            else:
                print("33[31;1m[%s]无权审批,交给下一个审批者33[0m" %self.name)
                self._successor.handle(request)
     
    class RequestHandlerL2(BaseHandler):
        '''第二级请求处理者'''
        name = "DeptManager"
        def handle(self,request):
            if request < 5000 :
                print("审批者[%s],请求金额[%s],审批结果[审批通过]"%(self.name,request))
            else:
                print("33[31;1m[%s]无权审批,交给下一个审批者33[0m" %self.name)
                self._successor.handle(request)
     
    class RequestHandlerL3(BaseHandler):
        '''第三级请求处理者'''
        name = "CEO"
        def handle(self,request):
            if request < 10000 :
                print("审批者[%s],请求金额[%s],审批结果[审批通过]"%(self.name,request))
            else:
                print("33[31;1m[%s]要太多钱了,不批33[0m"%self.name)
                #self._successor.handle(request)
     
    class RequestAPI(object):
        h1 = RequestHandlerL1()
        h2 = RequestHandlerL2()
        h3 = RequestHandlerL3() 
        h1.successor(h2)
        h2.successor(h3)
        
        def __init__(self,name,amount):
            self.name = name
            self.amount = amount
            
        def handle(self):
            '''统一请求接口'''
            self.h1.handle(self.amount)
     
    if __name__ == "__main__":
        r1 = RequestAPI("Burgess",8000)
        r1.handle()
        print(r1.__dict__)
    执行结果:
    #如OA系统 不同等级领导批示资金大小权限不同(根据资金大小自动流转到责任人)
    简单解释:
    1接口类对象内把最高层级处理者领对象赋值到比其低一层级处理者对象(层级高的对象作为形参实例化层级低对象)以此类推
    2.实例化接口类,把申请人和申请资金传递进去,执行该接口类对象处理方法
    3.该处理方法执行最低层级领导的处理方法(进行判断该资金是否自己有权限处理,没权限处理就调用比其高一层级的处理对象进行处理,以此类推)
     

  • 相关阅读:
    P1106 删数问题 / U83355 删数问题【升级版】
    P1955 [NOI2015] 程序自动分析
    P4447 [AHOI2018初中组]分组
    P1308 [NOIP2011 普及组] 统计单词数
    Django | 页面数据的缓存与使用
    Python 虚拟环境 | Mac/Linux下如何避坑安装配置Virtualenv
    python虚拟环境 | virtualenv 的简单使用 (图文)
    机器学习 | 浅谈K-近邻算法
    特征缩放 | 归一化和标准化 (下)
    简析方差、标准差与数值离散程度
  • 原文地址:https://www.cnblogs.com/absoluteli/p/14124072.html
Copyright © 2011-2022 走看看