大飞

大飞 关注TA

挑战一切!

大飞

大飞

关注TA

挑战一切!

  •  世界的顶端
  • 混口饭吃
  • 写了333,609字

最近回复

该文章投稿至Nemo社区   Python  板块 复制链接


Python 责任链设计模式

发布于 2018/12/07 17:31 2,036浏览 0回复 1,507

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

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

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

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

    代码例子:  

"""
责任链模式
"""
from abc import abstractmethod, ABCMeta


class Handler(metaclass=ABCMeta):
@abstractmethod
def handler_leave(self, day):
pass


# 总经理审批
class GenaralHandler(Handler):
def handler_leave(self, day):
if day <= 10:
print('总经理批准你%s天假,好好去玩吧' % day)
else:
print('你干脆辞职了吧')


# 部门经理审批
class DepartmentHandler(Handler):
def __init__(self):
self.upHandler = GenaralHandler()

def handler_leave(self, day):
if day <= 7:
print('部门经理批准你%s天假,好好去玩吧' % day)
else:
print('你请假超过七天,我无权受理,你去找总经理吧')
self.upHandler.handler_leave(day)


# 项目主管审批
class ProjectHandler(Handler):
def __init__(self):
self.upHandler = DepartmentHandler()

def handler_leave(self, day):
if day <= 3:
print('项目主管批准你%s天假,好好去玩吧' % day)
else:
print('你请假超过三天,我无权受理,你去找部门经理审批吧')
self.upHandler.handler_leave(day)


if __name__ == '__main__':
h = ProjectHandler();
h.handler_leave(5)

    输出结果:

/Users/lyf/PycharmProjects/WebFramework/venv/bin/python /Users/lyf/PycharmProjects/WebFramework/gof/zrl.py

你请假超过三天,我无权受理,你去找部门经理审批吧

部门经理批准你5天假,好好去玩吧

Process finished with exit code 0

点赞(1)

上一个文章:ButterKnife源码解读

下一个文章:Python 工厂模式

点了个评