Python使用设计模式中的责任链模式与迭代器模式的示例


Posted in Python onMarch 02, 2016

责任链模式

责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。

#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使用设计模式中的责任链模式与迭代器模式的示例

迭代器模式
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

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使用设计模式中的责任链模式与迭代器模式的示例

Python 相关文章推荐
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
Python 实现两个服务器之间文件的上传方法
Feb 13 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Django 重写用户模型的实现
Jul 29 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 Python
python time()的实例用法
Nov 03 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 #Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 #Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 #Python
实例解析Python设计模式编程之桥接模式的运用
Mar 02 #Python
Python随机生成带特殊字符的密码
Mar 02 #Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 #Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 #Python
You might like
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
vue 组件简介
2020/07/31 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
python反编译学习之字节码详解
2019/05/19 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
django 简单实现登录验证给你
2019/11/06 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
公司合作协议书范本
2014/04/18 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
数学教师个人工作总结
2015/02/06 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
Android中View.post和Handler.post的关系
2022/06/05 Java/Android
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android