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. 《SVN的操作流程及规范》

    安装说明: 下载路径:https://tortoisesvn.net/downloads.html 选择对应版本:   安装中文语言包:   右键进入setting设置,选择中文简体.     使用说 ...

  2. require sqlite3时报The specified module could not be found.错误

    http://dependencywalker.com/ 在这个站点下载对应平台的Dependency Walker,打开你自己编译好的.node文件(sqlite3\lib\binding\node ...

  3. Spring Boot学习--spring-boot-starter-parent及starters(转)

    在官方文档的第三部分的13块讲述了引用的管理,官方推荐的是使用Maven和Gradle. 我一直在用的是maven,而且使用maven有些优势–spring-boot-starter-parent,这 ...

  4. [Angular 8] Lazy loading with dynamic loading syntax

    @NgModule({ declarations: [AppComponent, HomeComponent], imports: [ BrowserModule, MatSidenavModule, ...

  5. LeetCode 308. Range Sum Query 2D - Mutable

    原题链接在这里:https://leetcode.com/problems/range-sum-query-2d-mutable/ 题目: Given a 2D matrix matrix, find ...

  6. Nginx 做JavaWeb负载均衡

    随着用户量的增大,单台服务器已经满足不了用户的需求. 准备工作:安装 gcc.pcre-devel.zlib.OpenSSL 一下是在线   离线请戳这里 gcc 安装安装 nginx 需要先将官网下 ...

  7. Linux操作系统常用命令合集——第四篇-文件系统权限操作(5个命令)

    1.umask [命令作用] 文件或目录创建时的遮罩码 [命令语法] umask     [选项]    [参数] [常用选项] -p  --输出的权限掩码可直接作为指令来执行 -s  --以符号方式 ...

  8. Linux操作系统常用命令合集——第一篇-文件和目录操作(40个命令)

    一.选项和参数的区别        在经过上一次的系统安装后我们已经成功登陆,登陆LInux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着“选项”(英文名:options)或“参数” ...

  9. NetworkX系列教程(2)-graph生成器

    小书匠Graph图论 本节主要讲解如何快速使用内置的方法生成graph,官方的文档在这里,里面包含了networkX的所有graph生成器,下面的内容只是我节选的内容,并将graph画出来而已. 声明 ...

  10. RabbitMQ的安装和管理

    c:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.5.1\sbin>------------------------------- ...