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. 前端学习笔记--CSS样式--列表和表格

    1.列表 2.表格 odd:奇数  even:偶数

  2. 一份令人愉快的vs代码包和资源的整理清单

    https://viatsko.github.io/awesome-vscode/ https://github.com/viatsko/awesome-vscode

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

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

  4. pid 及参数调试方法

    所谓PID指的是Proportion-Integral-Differential.翻译成中文是比例-积分-微分. 记住两句话: 1.PID是经典控制(使用年代久远) 2.PID是误差控制() 对直流电 ...

  5. linux 忘记root密码怎么处理。

    这个是不少人纠结的地方.一台服务器,太久没使用,然后又没有一个文件txt,excel记录那些密码相关的东西.所以导致很多信息忘记了. 参考文章:https://blog.csdn.net/cranky ...

  6. AS400 printer setting

    (1) CRTOUTQ OUTQ(TESTLIB/PRINTER2) (2) CRTDEVPRT ===> CRTDEVPRT DEVD(PRINTER2) DEVCLS(*LAN) TYPE( ...

  7. Python多线程笔记(一)

    Python中使用threading模块来实现多线程 threading提供一些常用的方法 threading.currentThread() 返回当前的线程变量 threading.enumerat ...

  8. Educational Codeforces Round 72

    目录 Contest Info Solutions A. Creating a Character B. Zmei Gorynich C. The Number Of Good Substrings ...

  9. Codeforces Round #501 (Div. 3)

    A - Points in Segments 题意:implement #include<bits/stdc++.h> using namespace std; typedef long ...

  10. 快速打造自己的PHPStorm主题

    ---恢复内容开始--- 一个优雅和舒适的界面,可以增加过多写入代码的动力. Phpstorm小型的白色主题比较简陋.为了打造一个优雅和舒适的界面,我们安装一件叫Material Theme UI的插 ...