Python使用设计模式中的责任链模式与迭代器模式的示例

1125次阅读  |  发布于5年以前

责任链模式

责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。


    #encoding=utf-8 
    # 
    #by panda 
    #职责连模式 

    def printInfo(info): 
      print unicode(info, 'utf-8').encode('gbk') 

    #抽象职责类 
    class Manager(): 
      successor = None 
      name = '' 
      def __init__(self, name): 
        self.name = name 

      def SetSuccessor(self, successor): 
        self.successor = successor 

      def HandleRequest(self, request): 
        pass 

    #具体职责类:经理 
    class CommonManager(Manager): 
      def HandleRequest(self, request): 
        if request.RequestType == '请假' and request.Number <= 2: 
          printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
        else: 
          if self.successor != None: 
            self.successor.HandleRequest(request) 

    #具体职责类:总监 
    class Majordomo(Manager): 
      def HandleRequest(self, request): 
        if request.RequestType == '请假' and request.Number <= 5: 
          printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
        else: 
          if self.successor != None: 
            self.successor.HandleRequest(request) 

    #具体职责类:总经理 
    class GeneralManager(Manager): 
      def HandleRequest(self, request): 
        if request.RequestType == '请假': 
          printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
        elif request.RequestType == '加薪' and request.Number <= 500: 
          printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number)) 
        elif request.RequestType == '加薪' and request.Number > 500: 
          printInfo('%s:%s 数量%d 再说吧' % (self.name, request.RequestContent, request.Number)) 

    class Request(): 
      RequestType = '' 
      RequestContent = '' 
      Number = 0 

    def clientUI(): 
      jinLi = CommonManager('金力') 
      zongJian = Majordomo('宗健') 
      zhongJingLi = GeneralManager('钟金利') 

      jinLi.SetSuccessor(zongJian) 
      zongJian.SetSuccessor(zhongJingLi) 

      request = Request() 
      request.RequestType = '请假' 
      request.RequestContent = '小菜请假' 
      request.Number = 1 
      jinLi.HandleRequest(request) 

      request.RequestType = '请假' 
      request.RequestContent = '小菜请假' 
      request.Number = 5 
      jinLi.HandleRequest(request) 

      request.RequestType = '加薪' 
      request.RequestContent = '小菜要求加薪' 
      request.Number = 500 
      jinLi.HandleRequest(request) 

      request.RequestType = '加薪' 
      request.RequestContent = '小菜要求加薪' 
      request.Number = 1000 
      jinLi.HandleRequest(request) 
      return 

    if __name__ == '__main__': 
      clientUI(); 

类图:

201632154510682.gif \(506×302\)

迭代器模式
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

python内置支持这种模式,所以一般来说,不用自己写,


    #encoding=utf-8 
    # 
    #by panda 
    #迭代器(Iterator)模式 

    def printInfo(info): 
      print unicode(info, 'utf-8').encode('gbk') 

    #迭代器抽象类 
    class Iterator: 
      def First(self): 
        pass 

      def Next(self): 
        pass 

      def IsDone(self): 
        pass 

      def CurrentItem(self): 
        pass 

    #集合抽象类 
    class Aggregate: 
      def CreateIterator(self): 
        pass 

    #具体迭代器类: 
    class ConcreteIterator(Iterator): 
      aggregate = None 
      current = 0 
      def __init__(self, aggregate): 
        self.aggregate = aggregate 
        self.current = 0 

      def First(self): 
        return self.aggregate[0] 

      def Next(self): 
        ret = None 
        self.current += 1 
        if(self.current < len(self.aggregate)): 
          ret = self.aggregate[self.current] 
        return ret 

      def IsDone(self): 
        if(self.current < len(self.aggregate)): 
          return False 
        else: 
          return True 

      def CurrentItem(self): 
        ret = None 
        if(self.current < len(self.aggregate)): 
          ret = self.aggregate[self.current] 
        return ret 

    #具体集合类 
    class ConcreteAggregate(Aggregate): 
      items = None 
      def __init__(self): 
        self.items = []     

    def clientUI(): 
      a = ConcreteAggregate() 
      a.items.append('大鸟') 
      a.items.append('小菜') 
      a.items.append('行李') 
      a.items.append('老外') 
      a.items.append('公交内部员工') 
      a.items.append('小偷') 


      printInfo('---------迭代器模式-------------') 
      i = ConcreteIterator(a.items) 
      item = i.First() 
      while(False == i.IsDone()): 
        printInfo("%s 请买车票!" % i.CurrentItem()); 
        i.Next() 

      printInfo('\n---------python内部迭代-------------') 
      for item in a.items: 
        printInfo("%s 请买车票!" % item); 
      return 

    if __name__ == '__main__': 
      clientUI(); 

类图:

201632154537727.gif \(638×401\)

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8