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('\n---------python内部迭代-------------')

for item in a.items: 

   
printInfo("%s 请买车票!" % item); 

  return

  

if __name__ == '__main__': 

  clientUI(); 

类图:

Python使用设计模式中的责任链模式与迭代器模式的示例的更多相关文章

  1. 如何在C#/.NET Core中使用责任链模式

    原文:Chain Of Responsbility Pattern In C#/.NET Core 作者:Wade 译者:Lamond Lu 最近我有一个朋友在研究经典的"Gang Of F ...

  2. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  3. Java设计模式13:责任链模式

    前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...

  4. Java网络编程--Netty中的责任链

    Netty中的责任链 设计模式 - 责任链模式 责任链模式(Chain of Responsibility Pattern)是一种是行为型设计模式,它为请求创建了一个处理对象的链.其链中每一个节点都看 ...

  5. 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用

    迭代器(Iterator)模式,也叫做游标(Cursor)模式.我们知道,在Java 容器中,为了提高容器遍历的方便性,把遍历逻辑从不同类型的集合类中抽取出来,避免向外部暴露集合容器的内部结构. 一. ...

  6. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  7. Java设计模式之九 ----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  8. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  9. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

随机推荐

  1. JQgrid处理json数据

    jqGrid 实例中文版网址:http://blog.mn886.net/jqGrid/国外官网:http://www.trirand.com/blog/jqgrid/jqgrid.html http ...

  2. 微信小程序导入Vant报错

    作者:如也_d1c0链接:https://www.jianshu.com/p/0d2332984f8c来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. 先放出来Vant ...

  3. HDU-1573-X问题(线性同余方程组)

    链接: https://vjudge.net/problem/HDU-1573 题意: 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1] ...

  4. docker学习(六)

    一.Dockerfile使用 Dockerfile 可以允许用户创建自定义的镜像. 1.基本结构Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行.一般的,Dockerfile ...

  5. 六十一.常用组件 、 Kafka集群 、 Hadoop高可用

    1.Zookeeper安装搭建Zookeeper集群并查看各服务器的角色停止Leader并查看各服务器的角色 1.1 安装Zookeeper1)编辑/etc/hosts ,所有集群主机可以相互 pin ...

  6. Gym - 102346G Getting Confidence 最小费用最大流

    Gym - 102346GGetting Confidence 题意:n*n的格子,每个格子上有一个数,要求每行每列都只能拿一个数,使得乘积最大,然后输出每列选择的是第几行的数. 如果是加法的话,那么 ...

  7. P2037 电话号码

    题目描述 一串由长长的数字组成的电话号码通常很难记忆.为了方便记忆,有种方法是用单词来方便记忆.例如用“Three Tens”来记忆电话3-10-10-10. 电话号码的标准形式是七位数字,中间用连字 ...

  8. jquery做个折叠面板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 在本机上用IO流实现复制粘贴功能

    /** * 复制文件夹 * @param sourcePath * @param targetPath * @throws IOException */ public void copyFolder( ...

  10. C语言应用--数据类型定制一结构体数组

    结构体定义成功后,其实和c语言内部的类型区别也不大了,自然可以用来定义结构体类型的数组了.我们根据结构体定义的方式不同,分别用多种方式定义结构体数组: