from abc import ABCMeta, abstractmethod
# 职责模式又称为责任链模式
# 譬如在公司中请假,如果是2天以内,部门领导有权力审批,2天到5天,还需分管领导,5天以上,提交行政部门
# 这样每一级可以动态判断自己是否可以审批,如果没有权力,就一级一级往上报
class Request(metaclass=ABCMeta):
"""请求(内容)"""
def __init__(self, name, dayoff, reason):
self._name = name
self._dayoff = dayoff
self._reason = reason
self._leader = None
def getName(self):
return self._name
def setName(self, name):
self._name = name
def getDayoff(self):
return self._dayoff
def setDayoff(self, dayoff):
self._dayoff = dayoff
def getLeader(self):
return self._leader
def setLeader(self, leader):
self._leader = leader
def sendRequest(self):
print(f"{self._name}因为{self._reason}申请请假{self._dayoff}天")
if self._leader is not None:
self._leader.handleRequest(self)
else:
print("您最大,不用向别人请假")
class Responsible(metaclass=ABCMeta):
"""责任人抽象"""
def __init__(self, name, title):
self._name = name
self._title = title
self._nextLeader = None
def getName(self):
return self._name
def getTitle(self):
return self._title
def setNextLeader(self, nextLeader):
self._nextLeader = nextLeader
def getNextLeader(self):
return self._nextLeader
def handleRequest(self, request):
"""请求处理"""
# 当前责任人处理请求
self._handleRequestImpl(request)
if self._nextLeader is not None:
self._nextLeader.handleRequest(request)
@abstractmethod
def _handleRequestImpl(self, request):
"""真正处理请求的方法"""
pass
class Person(Request):
pass
class Supervisor(Responsible):
"""主管"""
def __init__(self, name, title):
super().__init__(name, title)
def _handleRequestImpl(self, request):
if(request.getDayoff() < 2):
print(f"同意{request.getName()}请假,签字人:{self.getName()}({self.getTitle()})")
class DepartmentManager(Responsible):
"""部门总监"""
def __init__(self, name, title):
super().__init__(name, title)
def _handleRequestImpl(self, request):
if(request.getDayoff() > 2 and request.getDayoff() < 5):
print(f"同意{request.getName()}请假,签字人:{self.getName()}({self.getTitle()})")
class CEO(Responsible):
"""CEO"""
def __init__(self, name, title):
super().__init__(name, title)
def _handleRequestImpl(self, request):
if(request.getDayoff() > 5 and request.getDayoff() < 22):
print(f"同意{request.getName()}请假,签字人:{self.getName()}({self.getTitle()})")
class Adminstrator(Responsible):
"""行政人员"""
def __init__(self, name, title):
super().__init__(name, title)
def _handleRequestImpl(self, request):
print(f"{self.getName()}的请假申请已审核,情况属实!已备案处理。处理人:{self.getName()}({self.getTitle()})")
def test():
directorLeader = Supervisor("Eren", "客户端研发部经理")
departmentmanager = DepartmentManager("Eric", "技术研发中心总监")
directorLeader.setNextLeader(departmentmanager)
ceo = CEO("Helen", "创新文化公司CEO")
departmentmanager.setNextLeader(ceo)
adminstrator = Adminstrator("Nina", "行政中心总监")
ceo.setNextLeader(adminstrator)
will = Person("Will", 1, "参加MDCC大会")
will.setLeader(directorLeader)
will.sendRequest()
tom = Person("Tom", 20, "结婚")
tom.setLeader(directorLeader)
tom.sendRequest()
if __name__ == "__main__":
test()