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中的Numeric包和Numarray包使用教程
Apr 13 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
python字符串和常用数据结构知识总结
May 21 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
django中related_name的用法说明
May 20 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 Python
Pygame Time时间控制的具体使用详解
Nov 17 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下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
基于php split()函数的用法详解
2013/06/05 PHP
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
前端微信支付js代码
2016/07/25 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
python学习笔记:字典的使用示例详解
2014/06/13 Python
python实现简易动态时钟
2018/11/19 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
django实现支付宝支付实例讲解
2019/10/17 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
委托书格式
2014/08/01 职场文书
教师自查自纠材料
2014/10/14 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python
对讲机知识
2022/04/07 无线电
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android