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应用程序步骤及版本冲突问题解决
Nov 19 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
Python引用传值概念与用法实例小结
Oct 07 Python
tensorflow训练中出现nan问题的解决
Feb 10 Python
Python中利用xpath解析HTML的方法
May 14 Python
python监控文件并且发送告警邮件
Jun 21 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
Python Map 函数的使用
Aug 28 Python
超详细Python解释器新手安装教程
May 10 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自定义截取中文字符串-utf8版
2017/02/27 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
python轮询机制控制led实例
2020/05/03 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
物流合作计划书
2014/01/10 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
好人好事事迹材料
2014/02/12 职场文书
家长对学生的评语
2014/04/18 职场文书
涨价通知怎么写
2015/04/23 职场文书
同事打架检讨书
2015/05/06 职场文书
离婚纠纷代理词
2015/05/23 职场文书
代理词怎么写
2015/05/25 职场文书
趣味运动会通讯稿
2015/07/18 职场文书