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 18 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
python装饰器与递归算法详解
Feb 18 Python
Python实现Linux中的du命令
Jun 12 Python
Python实现购物程序思路及代码
Jul 24 Python
使用python3+xlrd解析Excel的实例
May 04 Python
Python 中导入csv数据的三种方法
Nov 01 Python
在python中bool函数的取值方法
Nov 01 Python
python原类、类的创建过程与方法详解
Jul 19 Python
记一次Django响应超慢的解决过程
Sep 17 Python
Python中常用的os操作汇总
Nov 05 Python
Python 数据分析之逐块读取文本的实现
Dec 14 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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
python列表返回重复数据的下标
2020/02/10 Python
什么是python的列表推导式
2020/05/26 Python
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
六月份红领巾广播稿
2014/02/03 职场文书
学生会竞聘书范文
2014/03/31 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
python 实现体质指数BMI计算
2021/05/26 Python
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server