ITPub博客

首页 > 数据库 > 数据库开发技术 > python 面向对象设计模式实践篇(17)-行为型:责任链实践

python 面向对象设计模式实践篇(17)-行为型:责任链实践

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-26 15:42:47 0 删除 编辑

行为型模式概述

定义:前篇初期中,我们讲过行为型模式主要解决的问题是:

用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。

特性:

  • 1:关注对象之间的交互和对象的响应
  • 2:对象的交互过程中能保持松散耦合
  • 3:不同的对象之间划分责任和算法的抽象化

责任链模式


所属分类

  • 行为型模式

意图

  • 用于将请求的发送方与处理请求的接收方解耦

  • 处理请求的过程中,让多个对象都有机会处理请求,避免请求发送者和接收者之间的关系耦合

  • 把诸多接收者所连成一条链,并沿着这条链传递该一个请求处理,直到有一个对象处理它为止

适用场景

  • 有多个的对象可以处理同一个性质的请求,哪个对象处理该请求运行时根据条件匹配来自动确定

  • 预先不清楚应该由哪个接受者对象来处理某个特定请求时的情况

角色对象

  • 抽象处理者(Handler)
  • 具体处理者(ConcreteHandler)
  • 客户端(Client)

实践

以一个系统登记告警通知示例说明:

当系统告警等级为5:只需要通知=初级运维工程师

当系统告警等级为4:需要通知= 初级运维工程师 + 中级运维工程师

当系统告警等级为3:需要通知= 初级运维工程师 + 中级运维工程师 + 高级运维工程师

当系统告警等级为2:需要通知= 初级运维工程师 + 中级运维工程师 + 高级运维工程师 +副总

当系统告警等级为1:需要通知= 初级运维工程师 + 中级运维工程师 + 高级运维工程师 +副总+CEO
  • 初级运维人员向-中级运维工程师汇报负责
  • 中级运维人员向-高级运维工程师汇报负责
  • 高级运维人员向-副总汇报负责
  • 副总向-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:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111714