• 责任链模式


    一、内容

    使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求

    直到有一个对象处理它为止

    二、角色

    • 抽象处理者
    • 具体处理者
    • 客户端

    例:请假部门批准:项目主管----》部门经理----》总经理 

    三、优点

    • 降低耦合度:一个对象无需知道是其他哪一个对象处理其请求

    四、缺点

    • 请求不保证被接收:链的末端没有处理或者链配置错误

    五、适用场景

    • 有多个对象可以处理一个请求,哪个对象处理由时间运行时决定
    • 在不明确接受者的情况下,向多个对象中的一个提交一个请求

    六 、示例代码

     1 from abc import ABCMeta, abstractmethod
     2 #
     3 class Handler(metaclass=ABCMeta):
     4     @abstractmethod
     5     def handle_leave(self, day):
     6         pass
     7 
     8 
     9 class GeneralManagerHandler(Handler):
    10     def handle_leave(self, day):
    11         if day < 10:
    12             print("总经理批准%d天假"%day)
    13         else:
    14             print("呵呵")
    15 
    16 
    17 class DepartmentManagerHandler(Handler):
    18     def __init__(self):
    19         self.successor = GeneralManagerHandler()  #责任链的后面的一个人
    20     def handle_leave(self, day):
    21         if day < 7:
    22             print("部门经理批准%d天假"%day)
    23         else:
    24             print("部门经理无权准假")
    25             self.successor.handle_leave(day)
    26 
    27 
    28 class ProjectDirectorHandler(Handler):
    29     def __init__(self):
    30         self.successor = DepartmentManagerHandler()
    31     def handle_leave(self, day):
    32         if day < 3:
    33             print("项目主管批准%d天假")
    34         else:
    35             print("项目主管无权准假")
    36             self.successor.handle_leave(day)
    37 
    38 
    39 day = 4
    40 h = ProjectDirectorHandler()
    41 h.handle_leave(day)
    请假示例
     1 #--高级例子--模仿js事件处理
     2 # JavaScript中假如有三个嵌套的div,每个div绑定一个事件,就像冒泡一样,先找里面的,
     3 # 如果里面有就是里面的事件,如果里面没有就找上一层的。以此类推
     4 from abc import ABCMeta, abstractmethod
     5 class Handler(metaclass=ABCMeta):
     6     @abstractmethod
     7     def add_event(self, func):
     8         pass
     9 
    10     @abstractmethod
    11     def handle(self):
    12         pass
    13 
    14 
    15 class BodyHandler(Handler):
    16     def __init__(self):
    17         self.func = None
    18 
    19     def add_event(self, func):
    20         self.func = func
    21 
    22     def handle(self):
    23         if self.func:
    24             return self.func()
    25         else:
    26             print("已到最后一级,无法处理")
    27 
    28 
    29 class ElementHandler(Handler):
    30     def __init__(self, successor):
    31         self.func = None
    32         self.successor = successor
    33 
    34     def add_event(self, func):
    35         self.func = func
    36 
    37     def handle(self):
    38         if self.func:
    39             return self.func()
    40         else:
    41             return self.successor.handle()
    42 
    43 
    44 # 客户端
    45 # <body><div><a>
    46 
    47 body = {'type': 'body', 'name': 'body', 'children': [], 'father': None}
    48 
    49 div = {'type': 'div', 'name': 'div', 'children': [], 'father': body}
    50 
    51 a = {'type': 'a', 'name': 'a', 'children': [], 'father': div}
    52 
    53 body['children'].append(div)
    54 div['children'].append(a)
    55 
    56 body['event_handler'] = BodyHandler()
    57 div['event_handler'] = ElementHandler(div['father']['event_handler'])
    58 a['event_handler'] = ElementHandler(a['father']['event_handler'])
    59 
    60 
    61 def attach_event(element, func):
    62     element['event_handler'].add_event(func)
    63 
    64 #test
    65 
    66 def func_div():
    67     print("这是给div的函数")
    68 
    69 def func_a():
    70     print("这是给a的函数")
    71 
    72 def func_body():
    73     print("这是给body的函数")
    74 
    75 # attach_event(div, func_div)
    76 attach_event(a, func_a)
    77 # attach_event(body, func_body)
    78 a['event_handler'].handle()
    模仿js事件处理
  • 相关阅读:
    ASP.NET Core路由中间件[4]: EndpointRoutingMiddleware和EndpointMiddleware
    ASP.NET Core路由中间件[3]: 终结点(Endpoint)
    ASP.NET Core路由中间件[2]: 路由模式
    ASP.NET Core路由中间件[1]: 终结点与URL的映射
    [LeetCode] 994. Rotting Oranges 腐烂的橘子
    [LeetCode] 993. Cousins in Binary Tree 二叉树的表兄弟节点
    [LeetCode] 992. Subarrays with K Different Integers 有K个不同整数的子数组
    [LeetCode] 991. Broken Calculator 损坏的计算器
    [LeetCode] 1143. Longest Common Subsequence 最长公共子序列
    [LeetCode] 990. Satisfiability of Equality Equations 等式方程的可满足性
  • 原文地址:https://www.cnblogs.com/morgana/p/8496298.html
Copyright © 2020-2023  润新知