简介Python设计模式中的代理模式与模板方法模式编程
这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下

代理模式
Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A)
提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介
python的例子
你先设想:一个对象提供rgb三种颜色值,我想获得一个对象的rgb三种颜色,但是我不想让你获得蓝色属性,怎么办?
class Proxy(object):
def __init__(self, subject):
self.__subject = subject
# 代理其实本质上就是属性的委托
def __getattr__(self, name):
return
getattr(self.__subject, name)
class RGB:
def __init__(self, red, green, blue):
self.__red =
red
self.__green
= green
self.__blue
= blue
def Red(self):
return
self.__red
def Green(self):
return
self.__green
def Blue(self):
return
self.__blue
class NoBlueProxy(Proxy):
# 我在这个子代理类拦截了blue的访问,这样就不会返回被代理的类的Blue属性
def Blue(self):
return
0
if __name__ == '__main__':
rgb = RGB(100, 192, 240)
print rgb.Red()
proxy = Proxy(rgb)
print proxy.Green()
noblue = NoBlueProxy(rgb)
print noblue.Green()
print noblue.Blue()
模板方法模式
不知道你有没有注意过,我们实现某个业务功能,在不同的对象会有不同的细节实现, 如果说策略模式,
策略模式是将逻辑封装在一个类(提到的文章中的Duck)中,然后使用委托的方式解决。
模板方法模式的角度是:把不变的框架抽象出来,定义好要传入的细节的接口. 各产品类的公共的行为
会被提出到公共父类,可变的都在这些产品子类中
python的例子
# 整个例子我们要根据不同需求处理的内容
ingredients = "spam eggs apple"
line = '-' * 10
# 这是被模板方法调用的基础函数
def iter_elements(getter, action):
"""循环处理的骨架"""
# getter是要迭代的数据,action是要执行的函数
for element in getter():
action(element)
print(line)
def rev_elements(getter, action):
"""反向的"""
for element in getter()[::-1]:
action(element)
print(line)
# 数据经过函数处理就是我们最后传给模板的内容
def get_list():
return ingredients.split()
# 同上
def get_lists():
return [list(x) for x in
ingredients.split()]
# 对数据的操作
def print_item(item):
print(item)
#反向处理数据
def reverse_item(item):
print(item[::-1])
# 模板函数
def make_template(skeleton, getter, action):
# 它抽象的传入了 骨架,数据,和子类的操作函数
def template():
skeleton(getter, action)
return template
# 列表解析,数据就是前面的2种骨架(定义怎么样迭代),2个分割数据的函数,正反向打印数据的组合
templates = [make_template(s, g, a)
for g in (get_list, get_lists)
for a in (print_item, reverse_item)
for s in (iter_elements, rev_elements)]
# 执行
for template in templates:
template()
简介Python设计模式中的代理模式与模板方法模式编程的更多相关文章
- 设计模式(二十二)模板方法模式 Template
泡茶?泡咖啡? 我们用泡茶和泡咖啡两种行为来引入这一设计模式. 思考一下“泡茶”的过程: 煮水 -> 用沸水泡茶叶 -> 把茶倒进杯子 -> 放点柠檬之类的佐料. 然后再看一下“泡咖 ...
- Android设计模式之命令模式、策略模式、模板方法模式
命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...
- [Python设计模式] 第13章 造小人——建造者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目1 用程序模拟一个画小人的过程,要求小人要有头,身子,左手,右手,左脚,右脚 ...
- Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- Java设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- 设计模式---组件协作模式之模板方法模式(Tempalte Method)
前提:组件协作模式 现代软件专业分工之后的第一个结构是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常见的模式. 我们常常使用框架来写自己的 ...
- Android设计模式(八)--模板方法模式
到国美面试Android的时候.问我的设计模式相关的问题: 1.单例模式的意义时什么. 2.有哪几种工厂方法模式: 3.你用过的模板方法模式.举例说明: 自己感觉答的一塌糊涂. 模板方法模式都没说出来 ...
- 设计模式——Spring IoC中用到的模板方法模式
基本概念 什么是模板方法(Template method):父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现. 最大的好处:代码复用,减少重复代码.除了子类要实现的特定方法,其他方法及方法 ...
- 设计模式17---设计模式之模板方法模式(Template Method)(行为型)
1.场景模拟 使用软件模拟登录控制,普通用户和工作人员用户,工作人员的密码在数据库中是加密的. 步骤大致如下: 前台提交,后台获取登录信息,同数据库中的登陆信息进行比较,只不过工作人员是加密的,普通用 ...
随机推荐
- WebService在ssm框架中的简单应用
WebService的概念 Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配 ...
- RF 中一条用例执行失败,终止其他用例执行
1. 需求: 执行某个测试套时,某条用例执行失败,则该用例下其他关键字不在执行(RF自带功能): 但实际情况下是 某条用例执行失败后,下面的用例再执行就没有意义了: 想满足某条用例执行失败,下面的用例 ...
- linux 安装MySql 5.7.20 操作步骤【亲测】
一. #卸载系统自带的Mariadb[root@master ~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64[root@ ...
- django Error: HINT: Add or change a related_name argument to the definition for 'UserProfile.groups' or 'User.groups'.
# 解决方案: 因自己重新封装user为UserProfile故在 settings中 添加自己的
- h5css3弹性盒子
弹性盒子: 老:display:box: 新:display:flex: 方向:flex-direction: 横向正方向 row/横向反方向 row-reverse/纵向正方向 column/纵向反 ...
- BZOJ 1576 树剖+LCT
题意:给定一张图,保证 $1$ 号点到其他所有点的最短路径是唯一的,求:对于点 $i$,不经过 $1$ 到 $i$ 最短路径上最后一条边的最短路. 题解:可以先建出最短路树,然后枚举每一条非树边. 对 ...
- 2017.11.8 Noip2017 考前模拟赛
----------------------------------T1---------------------------------- ——>足球联赛 题目描述 巴蜀中学新一季的足球联赛开 ...
- FOI冬令营 Day 3
目录 T1.签到题(sort) 传送门 Code T2.送分题(queue) 传送门 Code T3.简单题(game) 传送门 Code 咕咕咕 T1.签到题(sort) 传送门 原题:LOJ 27 ...
- (转)centos7安装telnet服务
借鉴:https://www.cnblogs.com/daipenglin/p/4934572.html 阅读目录 1 CentOS7.0 telnet-server 启动的问题 场景:在进行Teln ...
- 详解css3 pointer-events(阻止hover、active、onclick等触发事件来
pointer-events 更像是JavaScript,它能够: 阻止用户的点击动作产生任何效果 阻止缺省鼠标指针的显示 阻止CSS里的 hover 和 active 状态的变化触发事件 阻止Jav ...