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的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
python中requests小技巧
May 10 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
树莓派与PC端在局域网内运用python实现即时通讯
Jun 22 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
python request 模块详细介绍
Nov 10 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 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
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
php数组使用规则分析
2015/02/27 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
PHP 错误处理机制
2015/07/06 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
深入探讨前端框架react
2015/12/09 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
Python调用命令行进度条的方法
2015/05/05 Python
python分割列表(list)的方法示例
2017/05/07 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
python中的字符串内部换行方法
2018/07/19 Python
详解Python字典的操作
2019/03/04 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
创建省级文明单位实施方案
2014/02/27 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP