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中使用base64模块处理字符编码的教程
Apr 28 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
python实现两张图片的像素融合
Feb 23 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
python3.8下载及安装步骤详解
Jan 15 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
python如何求100以内的素数
May 27 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
详解Python openpyxl库的基本应用
Feb 26 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生成HTML静态页面实例代码
2008/08/31 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
javascript与CSS复习(二)
2010/06/29 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
Element Input组件分析小结
2018/10/11 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
python ---lambda匿名函数介绍
2019/03/13 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
师德师风建设方案
2014/05/08 职场文书
预备党员党支部意见
2015/06/02 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python