zoukankan      html  css  js  c++  java
  • 设计模式之职责模式

    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()
    
    
    
    
    
    
        
  • 相关阅读:
    Django-model基础
    web框架
    django-MTV
    我与前端之间不得不说的三天两夜之jQuery
    vertical-align和line-height的深入应用
    我与前端之间不得说的三天两夜之css基础
    mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数
    我与前端之间不得不说的三天两夜之html基础
    hdu2206 IP地址的计算
    get方式中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12985047.html
Copyright © 2011-2022 走看看