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实现类继承实例
Jul 04 Python
python正常时间和unix时间戳相互转换的方法
Apr 23 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
21行Python代码实现拼写检查器
Jan 25 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
详谈Python基础之内置函数和递归
Jun 21 Python
使用Python读取大文件的方法
Feb 11 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
python接口测试返回数据为字典取值方式
Feb 12 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检查是否是ajax请求的方法
2015/04/16 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
Jquery的Ajax技术使用方法
2019/01/21 jQuery
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
Python制作爬虫抓取美女图
2016/01/20 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
python使用tornado实现登录和登出
2018/07/28 Python
python生成lmdb格式的文件实例
2018/11/08 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Django异步任务线程池实现原理
2019/12/17 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
心得体会怎么写
2013/12/30 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年质检工作总结
2014/11/26 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书