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的组合模式与责任链模式编程示例的更多相关文章
- Python使用设计模式中的责任链模式与迭代器模式的示例
Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式
模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请 ...
- 十一个行为模式之责任链模式(Responsible Chain Pattern)
定义: 将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者.沿着这条链进行请求,直到有对象处理它为止. 结构图: Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子 ...
- Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)
一.概述 概念 UML简图 角色 抽象处理器:定义处理请求的接口 具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用) 当然这里必须指出,实际中纯的责任链模式很难寻找,一般是 ...
- 【责任链模式】责任链模式结合Spring实战Demo
备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...
- GoF23种设计模式之行为型模式之责任链模式
一.概述 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并且沿着这条链传递请求,直到有一个对象处理它为止.其设计思想是:给对多个对象处理一个请求的机会, ...
- .NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证
.NET责任链模式.单例模式.模板方法模式混用 前言 哇,看到题目挺长的,这个组合型的东西,到底能干啥呢?本篇文章来一起琢磨琢磨,这两天为了团队的软件赶工,我负责的那一块叫:插件管理器.我们团队的成员 ...
- 设计模式(13)--Chain of Responsibility(责任链模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...
随机推荐
- windows静态路由
本机:192.168.1.10 本机网关:192.168.1.254 目的IP:188.1.1.10 指定网关:192.168.1.107 最多跳数:10跳 route -p add 188.1 ...
- mysql和oracle的语法差异(网络收集)
oracle没有offet,limit,在mysql中我们用它们来控制显示的行数,最多的是分页了.oracle要分页的话,要换成rownum. oracle建表时,没有auto_increment,所 ...
- nginx理论基础
- BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
- Java-Web servlet控制器的引入
一.建包 二.建立实体类 参考二维表,考虑各个字段的名字.类型 private String id; private String name; private String address; publ ...
- Codeforces Round #608 (Div. 2) D. Portals
链接: https://codeforces.com/contest/1271/problem/D 题意: You play a strategic video game (yeah, we ran ...
- vue的组件创建和使用
首先说一下vue组件 什么是组件? 在我的理解,vue的所有页面内容都是组件. 什么是父子组件? 因为所有的页面内容都是组件,那么怎么区分父子组件呢?其实很简单,现在有一个页面,在js里面的 comp ...
- wget下载与tar压缩/解压
目录 wget命令 下载整个网站 压缩与解压 小节 wget命令 Usage: wget [OPTION]... [URL]... # 后台运行 -b, --background go to back ...
- Linux设置程序开机自启动,系统命令chkconfig及linux /etc/rc.d/目录的详解
整理了linux下程序开启几种方式,转载相关博客做统一记录 <linux程序设置开机自启动>转载自:https://www.cnblogs.com/flcz/p/7691532.html ...
- 大视频上传T级别解决方案
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...