zoukankan      html  css  js  c++  java
  • Python使用设计模式中的责任链模式与迭代器模式的示例

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

    这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可以参考下
    责任链模式
    责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。    
    #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();

    类图:

    迭代器模式
    迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
    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(' ---------python内部迭代-------------') 
      for item in a.items: 
        printInfo("%s 请买车票!" % item); 
      return
      
    if __name__ == '__main__': 
      clientUI(); 
    类图:

     

  • 相关阅读:
    【curl】Linux下命令行curl详解
    【httpwatch】httpwatch对测试的应用
    【岗位知识小记录】
    linux系统修改route路由
    yum无法正常安装,提示如下 There are no enabled repos Run "yum repolist all"
    Ubuntu14.04切换root用户
    【AAA】AAA协议介绍
    各种工具网站
    任职资格:
    推荐一个下载mac应用的良心网站
  • 原文地址:https://www.cnblogs.com/amengduo/p/9586309.html
Copyright © 2011-2022 走看看