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

yipeiwu_com5年前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(); 

类图:

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)

相关文章

Python的CGIHTTPServer交互实现详解

Python的CGIHTTPServer交互实现详解

介绍 对于服务器后端开发者而言,有时候需要把自己的一些服务直接暴露给PM或者其他RD使用,这个时候需要搭建一套web服务可以和前端用户做简单交互,按照最常规的做法,一般是用Apache或...

python面向对象法实现图书管理系统

python面向对象法实现图书管理系统

本文实例为大家分享了python实现图书管理系统的具体代码,供大家参考,具体内容如下 需求: 图书管理系统 1.查询图书 2.增加图书 3.借阅图书 4.归还图书 5.退出系统 书:...

解决Python二维数组赋值问题

解决Python二维数组赋值问题

当我们采用s=[[0]*3]*2初始化一个数组,然后对s[0][0]进行赋值,改变的是第一列所有的值。因为用s = [[0]*3]*2 初始化数组,他表示的是指向这个列表的引用,所以当你...

python如何将图片转换为字符图片

python如何将图片转换为字符图片

简介 一个简单的python程序,将图片转换为字符图片。 (为了简便,很多参数写死了,自己看着改吧。 (←∀←)) 正文 原图(侵删) 结果图 源码 [更多细节]——&...

Python中用altzone()方法处理时区的教程

 altzone()方法是time模块的属性。当地的DST时区的这返回的偏移量,在UTC西部秒钟,如果一个定义。这是负值,如果当地的DST时区为UTC东边(如西欧,包括英国)。...