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的Django框架部署的一些建议
Apr 09 Python
python中threading超线程用法实例分析
May 16 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
详解Django中间件的5种自定义方法
Jul 26 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
Python合并多张图片成PDF
Jun 09 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
下载文件的点击数回填
2006/10/09 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
基于Jquery的温度计动画效果
2010/06/18 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python使用chardet判断字符串编码的方法
2015/03/13 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
python实现发送邮件及附件功能
2021/03/02 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
数学专业毕业生自荐信
2013/11/10 职场文书
平面设计师的工作职责
2013/11/21 职场文书
将相和教学反思
2014/02/04 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
建设投标担保书
2014/05/13 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
python基础之爬虫入门
2021/05/10 Python
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL