美文网首页
设计模式 - 16.职责链模式 [行为型模式]

设计模式 - 16.职责链模式 [行为型模式]

作者: Zszen | 来源:发表于2020-03-26 23:31 被阅读0次
    大纲 小结
    基础准则 基础准则
    创建型模式 单例模式
    - 原型模式
    - 简单工厂模式
    - 抽象工厂模式
    - 建造者模式
    结构型模式 代理模式
    - 适配器模式
    - 桥接模式
    - 装饰器模式
    - 门面/外观模式
    - 享元模式
    - 组合模式
    行为型模式 模板方法模式
    - 策略模式
    - 命令模式
    - 职责链模式
    - 状态模式
    - 观察者模式
    - 中介者模式
    - 迭代器模式
    - 访问者模式
    - 备忘录模式
    - 解释器模式

    为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

    避免递归过深

    import abc
    
    class IClsA(metaclass=abc.ABCMeta):
    
        def __init__(self):
            self._next = None
    
        @property
        def next(self):
            return self._next
    
        @next.setter
        def next(self, next):
            self._next = next
    
        @abc.abstractmethod
        def handle_request(self, param):
            pass
    
    
    class ClsA1(IClsA):
        def handle_request(self, param):
            if param=='1':
                print('deal', self.__class__.__name__)
                return self
            elif self.next is not None:
                return self.next.handle_request(param)
            else:
                print('end')
                return None
    
    class ClsA2(IClsA):
        def handle_request(self, param):
            if param=='2':
                print('deal', self.__class__.__name__)
                return self
            elif self.next is not None:
                return self.next.handle_request(param)
            else:
                print('end')
                return None
    
    class ClsA_X(IClsA):
        def __init__(self, key):
            super().__init__()
            self.key = key
    
        def handle_request(self, param):
            if param == self.key:
                print('deal', self.__class__.__name__)
                return self
            elif self.next is not None:
                return self.next.handle_request(param)
            else:
                print('end')
                return None
    
    if __name__=='__main__':
        # a1 = ClsA1()
        # a2 = ClsA2()
        # a1.next = a2
        # print(a1.handle_request('2'))
        
        a0 = ClsA_X(0)
        a1 = a0
        for k in range(1,10000):
            aN = ClsA_X(k)
            a1.next = aN
            a1 = aN
        print(a0.handle_request(9999))
    

    相关文章

      网友评论

          本文标题:设计模式 - 16.职责链模式 [行为型模式]

          本文链接:https://www.haomeiwen.com/subject/vcgxuhtx.html