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中无限元素列表的实现方法
Aug 18 Python
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
Python实现合并两个有序链表的方法示例
Jan 31 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
详解用Python练习画个美队盾牌
Mar 23 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
python语言的优势是什么
Jun 17 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
Python 实现集合Set的示例
Dec 21 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.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
PHP URL路由类实例
2013/11/12 PHP
PHP IE中下载附件问题解决方法
2014/01/07 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
Display SQL Server Version Information
2007/06/21 Javascript
javascript一些不错的函数脚本代码
2008/09/10 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
python在地图上画比例的实例详解
2020/11/13 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
幼儿评语大全
2014/04/30 职场文书
公司员工辞职信范文
2015/05/12 职场文书
民事起诉书范本
2015/05/19 职场文书
php实例化对象的实例方法
2021/11/17 PHP