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.私有属性 class Person(object): def __init__(self,name,age): self.name = name self.age = age #实例属性 self ...

  2. [bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格 (莫比乌斯反演)

    题目描述 TTT组数据,给出NNN,MMM,求∑x=1N∑y=1Mlim(x,y)\sum_{x=1}^N\sum_{y=1}^M lim(x,y)\newlinex=1∑N​y=1∑M​lim(x, ...

  3. 51nod P1354 选数字 题解

    每日一题 day8 打卡 Analysis 背包+离散化 这题是我们一次模拟赛的T2,结果我的暴力全TLE了. 关键是如果将两个因数的乘积离散化在因数数组中之后等于这个乘积本身,说明a[j]*in离散 ...

  4. webservice的soap

    1.soap的定义: 2.使用TCP/IP Monitor监视Soap协议 eclipse工具,show view-->other-->debug-->TCP/IP Monitor ...

  5. webpack 4 的 proxy

    第一种 接口有api的 setupProxy.js const proxy = require('http-proxy-middleware'); module.exports = function( ...

  6. 后台(一)vue+element-ui (按需加载)

    vue init webpack    项目名称 npm install axios                    //先安装! npm install --save axios vue-ax ...

  7. Bzoj 3333 高级打字机(主席树)

    3333 高级打字机 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能 ...

  8. Java枚举抽象方法实战

    需求背景 需求已经确定了几个固定的常量值,并且每个常量值都有相同的行为,但是具体实现细节不同.建议使用枚举抽象方法,优点:结构清晰,便于扩展. 枚举类实现抽象方法 与常规抽象类一样,enum类允许我们 ...

  9. ansible handlers

    示例:安装nginx --- - hosts: hadoop #指定主机组 remote_user: root #远程执行命令的用户 gather_facts: no #是否获取远程主机的信息 tas ...

  10. Synchronized 原理

    1.同步代码块: 反编译结果: monitorenter : 每个对象有一个监视器锁(monitor).当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取moni ...