当前位置:首页 > 服务端 > Python设计模式:责任链模式

Python设计模式:责任链模式

2022年11月07日 21:11:13服务端8

设计模式十一:责任链模式

什么是责任链模式

用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。
原则:存在一个对象链,一开始将请求发给链中的第一个对象,对象决定其是否处理该请求,对象将请求转发给下一个对象,重复该过程,直到到达链尾。

使用场景

用于让多个对象来处理单个请求
用于预先不知道应该由哪个对象来处理某个特定请求

典型案例

售水机,钞票放入后传递到内部分类到恰当的容器。退币时,从恰当的容器获取钱币返回到出口。

实例代码

#ATM找零(多个处理一个)
class Money:
    def __init__(self,total):
        self.total = total
        self.money_array = [0,0,0,0,0]

    def __str__(self):
        return 'Hundred : {},\n Fifty : {},\n Ten : {},\n Five : {},\n One : {}'.format(self.money_array[0],self.money_array[1],self.money_array[2],self.money_array[3],self.money_array[4])

class ATM:
    def __init__(self,nextodd):
        self.nextodd = nextodd
        
    def handlemoney(self,money):
        self.nextodd.handlemoney(money)
        

class Hundred(ATM):
    def handlemoney(self,money):
        odd = money.total % 100
        num = int(money.total / 100)
        money.money_array[0] = num
        money.total = odd
        self.nextodd.handlemoney(money)

class Fifty(ATM):
    def handlemoney(self,money):
        odd = money.total % 50
        num = int(money.total / 50)
        money.money_array[1] = num
        money.total = odd
        self.nextodd.handlemoney(money)

class Ten(ATM):
    def handlemoney(self,money):
        odd = money.total % 10
        num = int(money.total / 10)
        money.money_array[2] = num
        money.total = odd
        self.nextodd.handlemoney(money)

class Five(ATM):
    def handlemoney(self,money):
        odd = money.total % 5
        num = int(money.total / 5)
        money.money_array[3] = num
        money.money_array[4] = odd

def main():
    money = Money(176)
    five = Five(None)
    ten = Ten(five)
    fifty = Fifty(ten) 
    hundred = Hundred(fifty)
    atm = ATM(hundred)
    atm.handlemoney(money)
    print(money)

if __name__ == "__main__":
    main()
#事件处理(预先不知哪个对象处理)

class Event:
    def __init__(self,name):
        self.name = name
    
    def __str__(self):
        return self.name

class Widget:
    def __init__(self,parent = None):
        self.parent = parent
    
    def handle(self,event):
        handler = 'handle_{}'.format(event)
        #判断实例类中是否存在相应的方法
        if hasattr(self,handler):
            method = getattr(self,handler)
            method(handler)
        #如果当前类没有相应方法则交给父类去处理
        elif self.parent:
            self.parent.handle(event)
        #如果父类也没有相应方法则交给默认方法去处理
        elif hasattr(self,'handle_default'):
            self.handle_default(event)

class MainWindow(Widget):
    def handle_close(self,event):
        print('MainWindow: {}'.format(event))

    def handle_default(self,event):
        print('MainWindow Default : {}'.format(event))

class SendDialog(Widget):
    def handle_paint(self,event):
        print('SendDialog : {}'.format(event))

class MsgText(Widget):
    def handle_down(self,event):
        print('MsgText : {}'.format(event))

def main2():
    mw = MainWindow()
    sd = SendDialog(mw)
    msg = MsgText(sd)
    for event in ('down','paint','unhandled','close'):
        evt = Event(event)
        # print('---------MainWindow---------')
        # mw.handle(evt)
        # print('---------SendDialog---------')
        # sd.handle(evt)
        print('---------MsgText---------')
        msg.handle(evt)
        print()


if __name__ == "__main__":
    main2()

作者:生活就是屁颠屁颠的过
来源链接:https://blog.csdn.net/youngdianfeng/article/details/103898886

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68391.html

分享给朋友:

“Python设计模式:责任链模式” 的相关文章

Python基础知识

Python基础知识

标识符,变量名、函数名、类名的统称 命名规范 只能包含字母、数字、下划线,并且不能以数字开头 不能与系统关键字、模块名相同 严格...

[Python] 字典操作近两万字大总结(超详细教程)

[Python] 字典操作近两万字大总结(超详细教程)

🔥 信仰:一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 🦄 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Python学习 🌠 首发时间:2022年5月...

炒冷饭系列:设计模式 装饰模式

炒冷饭系列:设计模式 装饰模式

炒冷饭系列:设计模式 装饰模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 钢琴弹得好是艺术,文章写的好也是艺术。 一、什么是装...

炒冷饭系列:设计模式 原型模式

炒冷饭系列:设计模式 原型模式

炒冷饭系列:设计模式 原型模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是原型模式...

炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象...

Windows下python环境变量配置

默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量。此时不能在命令行直接使用python命令。   1. 首先需要在系统中注册python环境变量:假设python的安装路径为c:\python2.6,则修改我的电脑->属性...

Python执行.sh脚本cataline环境变量配置

Python执行.sh脚本cataline环境变量配置

注:参考文档:https://blog.csdn.net/weixin_38322156/article/details/72852607;https://blog.csdn.net/johnnysun2015/article/details/78414684 一:问题,最近在用...

numpy的安装和使用

numpy的安装和使用

           自定义安装Python(记得勾选环境变量)后,首次使用IDLE或者DOC执行python使用numpy时会报如下错误:   这说明安装python过程中并未安装numpy,此时需要手...

python学习——解决:'chromedriver' executable needs to be in PATH问题

1、chromedriver.exe放在chrome安装目录文件夹 2、chromedriver.exe放在python安装目录文件夹 3、将chrome安装目录配置环境变量加到PATH中 作者:KellyWu 来源链接...

Python安装与环境变量的配置

Python安装与环境变量的配置

python下载:          Python安装包下载地址:http://www.python.org/               &nb...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。