Python设计模式-职责链模式

本文深入解析职责链设计模式,通过Python代码实现了一个请假审批流程的例子,展示了如何将多个处理者对象连接成一条链,请求沿链传递直到被处理。适用于理解软件设计模式中职责链的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

职责链模式:让多个对象都由可能接受请求,将这些接对象连接成一个责任链,并且沿着这条链传递请求,直到有对象处理它为止。

from abc import ABCMeta,abstractmethod

class Person:
    def __init__(self,name,dayoff):
        self.__name = name
        self.__dayoff = dayoff
        self.__leader = None

    def setLeader(self,leader):
        self.__leader = leader

    def getName(self):
        return  self.__name

    def getDayoff(self):
        return self.__dayoff

    def request(self):
        print("%s请假%d天"%(self.__name,self.__dayoff))
        if(self.__leader is not None):
            self.__leader.handleRequest(self)

class Manager(metaclass=ABCMeta):
    def __init__(self,title):
        self._title = title
        self._nextLeader = None

    def setNextLeader(self,nextLeader):
        self._nextLeader = nextLeader

    def getTitle(self):
        return self._title

    @abstractmethod
    def handleRequest(self,person):
        pass

class Supervisor(Manager):
    def __init__(self,title):
        super().__init__(title)

    def handleRequest(self,person):
        if(person.getDayoff()<=2):
            print("%s同意%s请假%d天"%(self.getTitle(),person.getName(),person.getDayoff()))

        if(self._nextLeader is not None):
            self._nextLeader.handleRequest(person)

class DepartmentManager(Manager):
    def __init__(self,title):
        super().__init__(title)

    def handleRequest(self, person):
        if (person.getDayoff() > 2 and person.getDayoff() < 5):
            print("%s同意%s请假%d天" % (self.getTitle(), person.getName(), person.getDayoff()))

        if (self._nextLeader is not None):
            self._nextLeader.handleRequest(person)

class CEO(Manager):
    def __init__(self,title):
        super().__init__(title)

    def handleRequest(self, person):
        if (person.getDayoff() > 5):
            print("%s同意%s请假%d天" % (self.getTitle(), person.getName(), person.getDayoff()))

        if (self._nextLeader is not None):
            self._nextLeader.handleRequest(person)


def test():
   su = Supervisor("上级主管")
   dm = DepartmentManager("部门经理")
   ceo = CEO("总经理");

   su.setNextLeader(dm)
   dm.setNextLeader(ceo)

   person = Person("AAA",1)
   person.setLeader(su)
   person.request()

   person = Person("BBB", 4)
   person.setLeader(su)
   person.request()

   person = Person("CCC", 7)
   person.setLeader(su)
   person.request()


test()

运行结果:

AAA请假1天
上级主管同意AAA请假1天
BBB请假4天
部门经理同意BBB请假4天
CCC请假7天
总经理同意CCC请假7

aaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值