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. python_面向对象——编程步骤

    校园管理系统: 设计一个学校机构管理系统,有总部.分校.有学院.老师.员工,实现具体如下需求: 1.有多个课程,课程要有定价 2.有多个班级,班级跟课程有关联 3.有多个学生,学生报名班级,交这个班级 ...

  2. CentOS 6.5下快速搭建ftp服务器

    来源:Linux社区 作者:Linux CentOS 6.5下快速搭建ftp服务器 1.用root 进入系统 2.使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp,若安装了v ...

  3. 并发编程:Thread和Runable-01

      1.继承Thread类(不推荐) 代码很简单,就不说了 public class ThreadTest02 { public static void main(String[] args) { n ...

  4. Selenium常用API的使用java语言之12-定位一组元素

    在第(五)节我们已经学习了8种定位方法, 那8种定位方法是针对单个元素定位的, WebDriver还提供了另外8种用于定位一组元素的方法. import org.openqa.selenium.By; ...

  5. javascript权威指南第21章 Ajax和Comet

    function createXHR(){ if(typeof XMLHttpRequest !='undefined'){ return new XMLHttpRequest(); }else if ...

  6. 批量给文件去BOM(百度网盘)

    链接:https://pan.baidu.com/s/1jC8RkyC0xX1lA-zZjOyDsw 提取码:geko 第一步:浏览你要移除BOM编码的文件夹.第二步:点击移除bom,随后会弹出提示框 ...

  7. [转][c++11]我理解的右值引用、移动语义和完美转发

    c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能.有点难理解,于是花时间整理一下自己的理解. 左值.右值 C++中所有的值都必然属于左值.右值二者之一.左值是指表达式结束后依然存在的 ...

  8. linux 查看某个进程内存占用情况命令

    1.先用ps查询进程号 ps -aux|grep 进程名字 2.查看更详细的内存占比 cat /proc/3664/status 返回结果:(其中VmRSS为进程所占用的内存)

  9. Yarn状态机

    1 概述 为了增大并发性,Yarn采用事件驱动的并发模型,将各种处理逻辑抽象成事件和调度器,将事件的处理过程用状态机表示.什么是状态机? 如果一个对象,其构成为若干个状态,以及触发这些状态发生相互转移 ...

  10. meshing-做类似ICEM的Y型剖分

    ​原视频下载地址:https://yunpan.cn/cqjeKkrhwwN3x  访问密码 c724