大话设计模式(Python版)--职责链模式

加薪代码初步:

#!/usr/bin/env python

class Request:
    @property
    def RequestType(self):
        return self.__requestType
    @RequestType.setter
    def RequestType(self,value):
        self.__requestType = value
    @property
    def RequestContent(self):
        return self.__requestContent
    @RequestContent.setter
    def RequestContent(self,value):
        self.__requestContent = value
    @property
    def Number(self):
        return self.__number
    @Number.setter
    def Number(self,value):
        self.__number = value

class Manager:
    def __init__(self,name):
        self._name = name
    def GetResult(self, managerLevel, request):
        if(managerLevel == 'manager'):
            if ((request.RequestType == 'leave') and (request.Number <= 2)) :
                print(self._name, request.RequestContent,'Number',request.Number,' is approved')
            else:
                print(self._name, request.RequestContent,'Number',request.Number,' is not approved, is not my authority')
        elif(managerLevel == 'director'):
            if ((request.RequestType == 'leave') and (request.Number <= 5)) :
                print(self._name, request.RequestContent,'Number',request.Number,' is approved')
            else:
                print(self._name, request.RequestContent,'Number',request.Number,' is not approved, is not my authority')
        elif(managerLevel == 'general manager'):
            if (request.RequestType == 'leave') :
                print(self._name, request.RequestContent,'Number',request.Number,' is approved')
            elif (request.RequestType == 'salary raise') :
                if (request.Number <= 500):
                    print(self._name, request.RequestContent,'Number',request.Number,' is approved')
                else:
                    print(self._name, request.RequestContent,'Number',request.Number,' is a little hard, let us talk about it later' )

def main():
    mr1 = Manager('Lily')
    mr2 = Manager('Tom')
    mr3 = Manager('Jack')
    rt = Request()
    rt.RequestType = 'salary raise'
    rt.RequestContent = 'freshman apply for a salary raise'
    rt.Number = 1000
    mr1.GetResult('manager',rt)
    mr2.GetResult('director',rt)
    mr3.GetResult('general manager', rt)
    rt2 = Request()
    rt2.RequestType = 'leave'
    rt2.RequestContent = 'freshman apply for a annual leave'
    rt2.Number = 3
    mr1.GetResult('manager',rt2)
    mr2.GetResult('director',rt2)
    mr3.GetResult('general manager', rt2)    

if __name__ == '__main__':
    main()                     
职责链模式:

#!/usr/bin/env python
from abc import abstractmethod,ABCMeta

class Handler:
    __metaclass__ = ABCMeta
    def SetSuccessor(self, successor):
        self._successor = successor
    @abstractmethod
    def HandleRequest(self, request):
        pass

class ConcreteHandler1(Handler):
    def HandleRequest(self, request):
        if request >= 0 and request <= 10:
            print(self.__class__.__name__, 'handle request ', request)
        elif self._successor != None:
            self._successor.HandleRequest(request)

class ConcreteHandler2(Handler):
    def HandleRequest(self, request):
        if request >= 10 and request <= 20:
            print(self.__class__.__name__, 'handle request ', request)
        elif self._successor != None:
            self._successor.HandleRequest(request)

class ConcreteHandler3(Handler):
    def HandleRequest(self, request):
        if request >= 20 and request <= 30:
            print(self.__class__.__name__, 'handle request ', request)
        elif self._successor != None:
            self._successor.HandleRequest(request)

def main():
    ch1 = ConcreteHandler1()
    ch2 = ConcreteHandler2()
    ch3 = ConcreteHandler3()
    ch1.SetSuccessor(ch2)
    ch2.SetSuccessor(ch3)
    request = [2,5,14,22,18,3,27,20]
    for rt in request:
        ch1.HandleRequest(rt)

if __name__ == '__main__':
    main()

加薪代码重构:

#!/usr/bin/env python
from abc import ABCMeta, abstractmethod

class Request:
    @property
    def RequestType(self):
        return self.__requestType
    @RequestType.setter
    def RequestType(self,value):
        self.__requestType = value
    @property
    def RequestContent(self):
        return self.__requestContent
    @RequestContent.setter
    def RequestContent(self,value):
        self.__requestContent = value
    @property
    def Number(self):
        return self.__number
    @Number.setter
    def Number(self,value):
        self.__number = value

class Manager:
    __metaclass__ = ABCMeta
    def __init__(self, name):
        self._name = name
    def SetSuperior(self, superior):
        self._superior = superior
    @abstractmethod
    def RequestApplications(self, request):
        pass

class CommonManager(Manager):
    def __init__(self,name):
        super(CommonManager,self).__init__(name)
    def RequestApplications(self, request):
        if request.RequestType == 'leave' and request.Number <= 2:
            print(self.__class__.__name__,':', request.RequestContent,'number',request.Number,'is approved')
        else:
            if self._superior != None:
                self._superior.RequestApplications(request)

class Majordomo(Manager):
    def __init__(self,name):
        super(Majordomo,self).__init__(name)
    def RequestApplications(self, request):
        if request.RequestType == 'leave' and request.Number <= 5:
            print(self.__class__.__name__,':', request.RequestContent,'number',request.Number,'is approved')
        else:
            if self._superior != None:
                self._superior.RequestApplications(request)

class GeneralManager(Manager):
    def __init__(self,name):
        super(GeneralManager,self).__init__(name)
    def RequestApplications(self, request):
        if request.RequestType == 'leave':
            print(self.__class__.__name__,':', request.RequestContent,'number',request.Number,'is approved')
        elif(request.RequestType == 'salary raise') :
            if (request.Number <= 500):
                print(self.__class__.__name__, request.RequestContent,'Number',request.Number,' is approved')
            else:
                print(self.__class__.__name__, request.RequestContent,'Number',request.Number,' is a little hard, let us talk about it later' )

def main():
    cm = CommonManager('Lily')
    md = Majordomo('Tom')
    gm = GeneralManager('Jack')
    cm.SetSuperior(md)
    md.SetSuperior(gm)
    rt = Request()
    rt.RequestType = 'salary raise'
    rt.RequestContent = 'freshman apply for a salary raise'
    rt.Number = 1000
    cm.RequestApplications(rt)
    rt2 = Request()
    rt2.RequestType = 'leave'
    rt2.RequestContent = 'freshman apply for a annual leave'
    rt2.Number = 3
    cm.RequestApplications(rt2)

if __name__ == '__main__':
    main()



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值