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正则表达式re模块详细介绍
May 29 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
在Django框架中设置语言偏好的教程
Jul 27 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
python圣诞树编写实例详解
Feb 13 Python
基于Python实现粒子滤波效果
Dec 01 Python
python 实现ping测试延迟的两种方法
Dec 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
YB217、YB235、YB400浅听
2021/03/02 无线电
PHP制作百度词典查词采集器
2015/01/29 PHP
php实现json编码的方法
2015/07/30 PHP
类之Prototype.js学习
2007/06/13 Javascript
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
2013/11/26 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
JavaScript事件处理程序详解
2017/09/19 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
分享Python字符串关键点
2015/12/13 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
python实现手机通讯录搜索功能
2018/02/22 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
中学门卫岗位职责
2013/12/26 职场文书
公司办公室岗位职责
2014/03/19 职场文书
奥林匹克的口号
2014/06/13 职场文书
银行求职自荐信
2014/06/30 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
2015年度班主任自我评价
2015/03/11 职场文书