定义:前篇初期中,我们讲过行为型模式主要解决的问题是:
用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。
特性:
用于将请求的发送方与处理请求的接收方解耦
处理请求的过程中,让多个对象都有机会处理请求,避免请求发送者和接收者之间的关系耦合
把诸多接收者所连成一条链,并沿着这条链传递该一个请求处理,直到有一个对象处理它为止
有多个的对象可以处理同一个性质的请求,哪个对象处理该请求运行时根据条件匹配来自动确定
预先不清楚应该由哪个接受者对象来处理某个特定请求时的情况
以一个系统登记告警通知示例说明:
当系统告警等级为5:只需要通知=初级运维工程师
当系统告警等级为4:需要通知= 初级运维工程师 + 中级运维工程师
当系统告警等级为3:需要通知= 初级运维工程师 + 中级运维工程师 + 高级运维工程师
当系统告警等级为2:需要通知= 初级运维工程师 + 中级运维工程师 + 高级运维工程师 +副总
当系统告警等级为1:需要通知= 初级运维工程师 + 中级运维工程师 + 高级运维工程师 +副总+CEO
责任链非常的清晰!
顺着上面的思路一般日常的是够用了!所以使用一般的if判断应该是可以完成的:
class Role():
def __init__(self,name):
self.name = name
def send_notice(self, mes):
print("发送通知给:%s,具体告警信息为:%s"%(self.name,mes))
class NoticeAction:
def action(self,lev = 5):
if lev == 5:
Role(name="初级运维工程师").send_notice("系统%s级异常告警!XXX故障"%(lev))
elif lev == 4:
Role(name="初级运维工程师").send_notice("系统%s级异常告警!XXX故障"%(lev))
Role(name="中级运维工程师").send_notice("系统%s级异常告警!XXX故障"%(lev))
elif lev == 3:
Role(name="初级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="中级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="高级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
elif lev == 2:
Role(name="初级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="中级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="高级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="副总").send_notice("系统%s级异常告警!XXX故障" % (lev))
elif lev == 1:
Role(name="初级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="中级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="高级运维工程师").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="副总").send_notice("系统%s级异常告警!XXX故障" % (lev))
Role(name="CEO").send_notice("系统%s级异常告警!XXX故障" % (lev))
if __name__ == '__main__':
NoticeAction().action(lev=5)
输出结果为:
发送通知给:初级运维工程师,具体告警信息为:系统5级异常告警!XXX故障
但是当公司又上升到另一个层次了!到了一个集团之后,各自规则需求的变成,可能就会出现复杂的耦合。使用采用责任链模式可以解决这种问题,把问题处理接收的对象提交到一个链上。
#!/usr/bin/evn python
# coding=utf-8
from abc import ABCMeta, abstractmethod
class NoticeAction(metaclass=ABCMeta):
@abstractmethod
def action(self, lev_repuest,msg): pass
class Chujiyunwei(NoticeAction):
def __init__(self, sou):
self.name = "初级运维工程师"
self.sou = sou
def action(self, lev_repuest,msg):
if lev_repuest == 5:
print("发送通知给:%s,具体告警信息为:%s" % (self.name, "系统%s级异常告警!%s故障" % (lev_repuest,msg)))
else:
# 传递给下一个
print("【%s】需要想负责人汇报===传递异常给负责人【%s】》:发送通知给:%s,具体告警信息为:%s" % (self.name, self.sou.name, self.name, "系统【%s】级异常告警!%s故障" % (lev_repuest,msg)))
self.sou.action(lev_repuest,msg)
class Zhongjiyunwei(NoticeAction):
def __init__(self, sou):
self.name = "中级运维工程师"
self.sou = sou
def action(self, lev_repuest, msg):
if lev_repuest == 4:
print("发送通知给:%s,具体告警信息为:%s" % (self.name, "系统%s级异常告警!%s故障" % (lev_repuest, msg)))
else:
# 传递给下一个
print("【%s】需要想负责人汇报===传递异常给负责人【%s】》:发送通知给:%s,具体告警信息为:%s" % (self.name, self.sou.name, self.name, "系统【%s】级异常告警!%s故障" % (lev_repuest, msg)))
self.sou.action(lev_repuest, msg)
class Gojiyunwei(NoticeAction):
def __init__(self, sou):
self.name = "高级运维工程师"
self.sou = sou
def action(self, lev_repuest, msg):
if lev_repuest == 3:
print("发送通知给:%s,具体告警信息为:%s" % (self.name, "系统%s级异常告警!%s故障" % (lev_repuest, msg)))
else:
# 传递给下一个
print("【%s】需要想负责人汇报===传递异常给负责人【%s】》:发送通知给:%s,具体告警信息为:%s" % (self.name, self.sou.name, self.name, "系统【%s】级异常告警!%s故障" % (lev_repuest, msg)))
self.sou.action(lev_repuest, msg)
class Fuzong(NoticeAction):
def __init__(self, sou):
self.name = "副总"
self.sou = sou
def action(self, lev_repuest, msg):
if lev_repuest == 2:
print("发送通知给:%s,具体告警信息为:%s" % (self.name, "系统%s级异常告警!%s故障" % (lev_repuest, msg)))
else:
# 传递给下一个
print("【%s】需要想负责人汇报===传递异常给负责人【%s】》:发送通知给:%s,具体告警信息为:%s" % (self.name, self.sou.name, self.name, "系统【%s】级异常告警!%s故障" % (lev_repuest, msg)))
self.sou.action(lev_repuest, msg)
class Ceo(NoticeAction):
def __init__(self):
self.name = "Ceo"
def action(self, lev_repuest, msg):
if lev_repuest == 1:
print("发送通知给:%s,具体告警信息为:%s" % (self.name, "系统%s级异常告警!%s故障" % (lev_repuest, msg)))
else:
# 传递给下一个
print('已经顶级责任人了!!')
if __name__ == '__main__':
# CODE
ceo = Ceo()
# 副总--------对CEP负责
fuzong01 = Fuzong(ceo)
# 高级运维人员--------对副总负责负责
gaoji01 = Gojiyunwei(fuzong01)
# 中级运维人员--------对高级工程师负责负责
zhongji01 = Zhongjiyunwei(gaoji01)
# 初级运维人员--------对中级工程师负责负责
chuji01 = Chujiyunwei(zhongji01)
# 从最低的一级开始发送处理等级---------触发1告警
chuji01.action(lev_repuest=5,msg="程序运行遇到Bug了")
print("==="*20)
chuji01.action(lev_repuest=3, msg="系统负载突然飙升!")
print("===" * 20)
# 从最低的一级开始发送处理等级---------触发1告警
chuji01.action(lev_repuest=2, msg="系统被黑了!")
print("===" * 20)
chuji01.action(lev_repuest=1,msg="公司的银行被查封了!")
输出结果:
发送通知给:初级运维工程师,具体告警信息为:系统5级异常告警!程序运行遇到Bug了故障
============================================================
【初级运维工程师】需要想负责人汇报===传递异常给负责人【中级运维工程师】》:发送通知给:初级运维工程师,具体告警信息为:系统【3】级异常告警!系统负载突然飙升!故障
【中级运维工程师】需要想负责人汇报===传递异常给负责人【高级运维工程师】》:发送通知给:中级运维工程师,具体告警信息为:系统【3】级异常告警!系统负载突然飙升!故障
发送通知给:高级运维工程师,具体告警信息为:系统3级异常告警!系统负载突然飙升!故障
============================================================
【初级运维工程师】需要想负责人汇报===传递异常给负责人【中级运维工程师】》:发送通知给:初级运维工程师,具体告警信息为:系统【2】级异常告警!系统被黑了!故障
【中级运维工程师】需要想负责人汇报===传递异常给负责人【高级运维工程师】》:发送通知给:中级运维工程师,具体告警信息为:系统【2】级异常告警!系统被黑了!故障
【高级运维工程师】需要想负责人汇报===传递异常给负责人【副总】》:发送通知给:高级运维工程师,具体告警信息为:系统【2】级异常告警!系统被黑了!故障
发送通知给:副总,具体告警信息为:系统2级异常告警!系统被黑了!故障
============================================================
【初级运维工程师】需要想负责人汇报===传递异常给负责人【中级运维工程师】》:发送通知给:初级运维工程师,具体告警信息为:系统【1】级异常告警!公司的银行被查封了!故障
【中级运维工程师】需要想负责人汇报===传递异常给负责人【高级运维工程师】》:发送通知给:中级运维工程师,具体告警信息为:系统【1】级异常告警!公司的银行被查封了!故障
【高级运维工程师】需要想负责人汇报===传递异常给负责人【副总】》:发送通知给:高级运维工程师,具体告警信息为:系统【1】级异常告警!公司的银行被查封了!故障
【副总】需要想负责人汇报===传递异常给负责人【Ceo】》:发送通知给:副总,具体告警信息为:系统【1】级异常告警!公司的银行被查封了!故障
发送通知给:Ceo,具体告警信息为:系统1级异常告警!公司的银行被查封了!故障
总结:责任模式,说到底就是把相关的负责人串联起来,彼此根据规则来匹配是否需要传递相关的消息。
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
小钟同学 | 文 【原创】| QQ:308711822
1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。