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序列之list和tuple常用方法以及注意事项
Jan 09 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
Python统计单词出现的次数
Apr 04 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
Python实现爬虫爬取NBA数据功能示例
May 28 Python
Pycharm导入Python包,模块的图文教程
Jun 13 Python
python对文件的操作方法汇总
Feb 28 Python
python的flask框架难学吗
Jul 31 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
Python实现京东抢秒杀功能
Jan 25 Python
Python selenium模拟网页点击爬虫交管12123违章数据
May 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
php生成mysql的数据字典
2016/07/07 PHP
php给数组赋值的实例方法
2019/09/26 PHP
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
跟老齐学Python之做一个小游戏
2014/09/28 Python
python实现合并两个数组的方法
2015/05/16 Python
python在控制台输出进度条的方法
2015/06/20 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Python切图九宫格的实现方法
2019/10/10 Python
python实现横向拼接图片
2020/03/23 Python
python语言的优势是什么
2020/06/17 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
2015年新农村建设工作总结
2015/05/22 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
会计专业自荐信范文
2019/05/22 职场文书
mysql优化
2021/04/06 MySQL
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS
详解Python内置模块Collections
2022/03/22 Python