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中实现结构相似的函数调用方法
Mar 10 Python
python动态参数用法实例分析
May 25 Python
Python读写文件方法总结
Jun 09 Python
python实现的用于搜索文件并进行内容替换的类实例
Jun 28 Python
Django的URLconf中使用缺省视图参数的方法
Jul 18 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
详解python中asyncio模块
Mar 03 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
Python sublime安装及配置过程详解
Jun 29 Python
Python datetime 如何处理时区信息
Sep 02 Python
去除python中的字符串空格的简单方法
Dec 22 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
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
jquery异步循环获取功能实现代码
2010/09/19 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
Python程序设计入门(3)数组的使用
2014/06/16 Python
python简单读取大文件的方法
2016/07/01 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
python微信撤回监测代码
2019/04/29 Python
Python适配器模式代码实现解析
2019/08/02 Python
如何利用python发送邮件
2020/09/26 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
护理学毕业生求职信
2013/11/14 职场文书
工作睡觉检讨书
2014/02/25 职场文书
奉献演讲稿范文
2014/05/21 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
导游词之沈阳植物园
2019/11/30 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技