Python的组合模式与责任链模式编程示例


Posted in Python onFebruary 02, 2016

组合模式
我们把Composite模式看成一个复杂的属性结构,其实基本有三种角色:树干(定义一些操作树叶leaf的操作),树枝(树干上有很多树枝)和树叶(树干想要具体操作的对象) ,Composite模式帮我们实现:即它们在充当对象的时候,还是其他对象的容易,从而提供一致性

python的例子

class Trunk(object):
  '''树干'''
  def __str__(self):
    pass

  def subtree(self):
    pass

class Composite(Trunk):
  def __init__(self, left=None, right=None, length=None):
    self.left=left
    self.right=right
    self.length=length

  def __str__(self):
    # 这个结果是在调用subtree()的时候返回
    if self.length:
      return "(" + self.left.__str__() + ", " + self.right.__str__() + ")" + ": " + str(self.length) 
    else:
      return "(" + self.left.__str__() + ", " + self.right.__str__() + ")"

    # 这里其实就是一个技巧,通过这个函数返回下一级的对象,也就是它既是对象还可以是对象的容器
    def subtree(self):        
      return Composite(self.left, self.right)

class Leaf(Trunk):
  '''叶子类,它没办法继续延伸了'''
  def __init__(self, name, length=None):
    self.name = name
    self.length=length
    self.left = None
    self.right = None

  def __str__(self):
    return self.name + ": " + str(self.length)

  def subtree(self):
    return Leaf(self.name, self.length)


if __name__ == "__main__":
  # 只有叶子那么就直接返回__str__的拼装结果
  t1 = Leaf('A', 0.71399)
  print t1
  # 有个2个叶子的组合,返回的是2个叶子的对象的组合
  t2 = Composite(Leaf('B', -0.00804), 
    Leaf('C', 0.07470))
  print t2
  # 这个是嵌套的叶子的组合,树干上面有树枝,树枝上面有叶子
  t3 = Composite(Leaf('A', 0.71399),
    Composite(Leaf('B', -0.00804), 
        Leaf('C', 0.07470), 0.1533), 0.0666)

  print t3
  # 直接通过左右节点找到对应的叶子对象了
  t4 = t3.right.right.subtree()
  print t4
  # t3的左树其实就是叶子对象了
  t5 = t3.left.subtree()
  print t5

责任链模式
比如我们还在读书的时候,考试的分数都是几个档次,比如90-100分,80-90分,好吧我想做一个根据分数打印你的学习成绩的反馈, 比如90-100就是A+,80-90就是A,70-80就是B+… 当然你可以用很多种方法实现,我这里就来实现一个Chain模式:用一系列的类来响应, 但只有遇到适合处理它的类才会处理,类似与case和switch的作用

python的例子

class BaseHandler:
  # 它起到了链的作用
  def successor(self, successor):
    self.successor = successor

class ScoreHandler1(BaseHandler):
  def handle(self, request):
    if request > 90 and request <= 100:
      return "A+"
    else:
      # 否则传给下一个链,下同,但是我是要return回结果的
      return self.successor.handle(request)

class ScoreHandler2(BaseHandler):
  def handle(self, request):
    if request > 80 and request <= 90:
      return "A"
    else:
      return self.successor.handle(request)

class ScoreHandler3(BaseHandler):
  def handle(self, request):
    if request > 70 and request <= 80:
      return "B+"
    else:
      return "unsatisfactory result"

class Client:
  def __init__(self):
    h1 = ScoreHandler1()
    h2 = ScoreHandler2()
    h3 = ScoreHandler3()
    # 注意这个顺序,h3包含一个类似于default结果的东西,是要放在最后的,其他的顺序是无所谓的,比如h1和h2
    h1.successor(h2)
    h2.successor(h3)

    requests = {'zhangsan': 78,
          'lisi': 98,
          'wangwu': 82,
          'zhaoliu': 60}
    for name, score in requests.iteritems():
      print '{} is {}'.format(name, h1.handle(score))

if __name__== "__main__":
  client = Client()
Python 相关文章推荐
Python SQLite3数据库操作类分享
Jun 10 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
Python中 map()函数的用法详解
Jul 10 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Numpy之random函数使用学习
Jan 29 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
linux环境下Django的安装配置详解
Jul 22 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
Python 实现自动完成A4标签排版打印功能
Apr 09 Python
Python 字符串池化的前提
Jul 03 Python
python matlab库简单用法讲解
Dec 31 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 #Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 #Python
Python找出9个连续的空闲端口
Feb 01 #Python
Python 爬虫的工具列表大全
Jan 31 #Python
python在不同层级目录import模块的方法
Jan 31 #Python
在Python中移动目录结构的方法
Jan 31 #Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 #Python
You might like
一个oracle+PHP的查询的例子
2006/10/09 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
python tkinter实现屏保程序
2019/07/30 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
Python通过字典映射函数实现switch
2020/11/06 Python
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
super关键字的用法
2012/04/10 面试题
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
渡河少年教学反思
2014/02/12 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
个人作风建设总结
2014/10/23 职场文书
汽车销售助理岗位职责
2015/04/14 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书