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 linecache.getline()读取文件中特定一行的脚本
Sep 06 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
python 如何获取页面所有a标签下href的值
May 06 Python
浅谈pytorch中stack和cat的及to_tensor的坑
May 20 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企业级应用之常见缓存技术篇
2011/01/27 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
JS性能优化笔记搜索整理
2013/08/21 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
requireJS使用指南
2016/04/27 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
Python计算一个文件里字数的方法
2015/06/15 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
简单解析Django框架中的表单验证
2015/07/17 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
Python日期时间Time模块实例详解
2019/04/15 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
django自定义模板标签过程解析
2019/12/14 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
两只小狮子教学反思
2014/02/05 职场文书
社会实践的活动方案
2014/08/22 职场文书
学籍证明模板
2014/11/21 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
学习nginx基础知识
2021/09/04 Servers
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android
python manim实现排序算法动画示例
2022/08/14 Python