Python的组合模式与责任链模式编程示例

这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下

组合模式

我们把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的组合模式与责任链模式编程示例的更多相关文章

  1. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  2. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  3. Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式

    模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请 ...

  4. 十一个行为模式之责任链模式(Responsible Chain Pattern)

    定义: 将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者.沿着这条链进行请求,直到有对象处理它为止. 结构图: Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子 ...

  5. Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)

    一.概述 概念 UML简图 角色 抽象处理器:定义处理请求的接口 具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用) 当然这里必须指出,实际中纯的责任链模式很难寻找,一般是 ...

  6. 【责任链模式】责任链模式结合Spring实战Demo

    备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...

  7. GoF23种设计模式之行为型模式之责任链模式

    一.概述 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并且沿着这条链传递请求,直到有一个对象处理它为止.其设计思想是:给对多个对象处理一个请求的机会, ...

  8. .NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证

    .NET责任链模式.单例模式.模板方法模式混用 前言 哇,看到题目挺长的,这个组合型的东西,到底能干啥呢?本篇文章来一起琢磨琢磨,这两天为了团队的软件赶工,我负责的那一块叫:插件管理器.我们团队的成员 ...

  9. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

随机推荐

  1. HDU - 4431 Mahjong (模拟+搜索+哈希+中途相遇)

    题目链接 基本思路:最理想的方法是预处理处所有胡牌的状态的哈希值,然后对于每组输入,枚举每种新加入的牌,然后用哈希检验是否满足胡牌的条件.然而不幸的是,由于胡牌的状态数过多(4个眼+一对将),预处理的 ...

  2. HDU - 6582 Path (最短路+最小割)

    题意:给定一个n个点m条边的有向图,每条边有个长度,可以花费等同于其长度的代价将其破坏掉,求最小的花费使得从1到n的最短路变长. 解法:先用dijkstra求出以1为源点的最短路,并建立最短路图(只保 ...

  3. hive判断数据一个表是否在另一个表中(二)

    1.一个表中的数据不存在另一个表中 2.一个表中的数据 存在另一个表中:

  4. 阅读之MySQL数据库分表

    移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据等这样的分析,都需要依靠数据统计和分析,当数据量小时,数据库方面的优化显得不太重要,一旦数据量越来越大,系统响应会变慢,TPS直线下降,直至 ...

  5. qt5--自定义控件封装

    视频教程地址:https://www.bilibili.com/video/av51766541/?p=30

  6. SIM800c收发短信及AT指令

    一.sim800设备安装 淘宝搜索sim800,差不多就是这么个样子 购买之后,安装手机卡,卡的缺口向外插入,会有卡住的感觉,再按一下卡会弹出 安装usb转串口驱动(CH340),设备的指示灯先是快闪 ...

  7. idea maven projects 工具栏按钮的作用

    1.Execute Maven Goal  弹出可执行的 Maven 命令的输入框.有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮 2.Toggle Offline Mode 英文 ...

  8. AcWing:138. 兔子与兔子(字符串Hash)

    很久很久以前,森林里住着一群兔子. 有一天,兔子们想要研究自己的 DNA 序列. 我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母). 然后我们每 ...

  9. linux crontab 定时任务,任务命令单独linux执行正常,放定时任务就不执行了,解决办法 (原)

    这是我crontab里面的内容 */30 * * * *  ./usr/bin/wget -q -O sync_log.txt http://fly.dllm.cn/index.php/Home/In ...

  10. R_Studio(时序)Apriori算法寻找频繁项集的方法

    应用ARIMA(1,1,0)对2015年1月1日到2015年2月6日某餐厅的销售数量做为期5天的预测 setwd('D:\\dat') #install.packages("forecast ...