简介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.场景模拟 使用软件模拟登录控制,普通用户和工作人员用户,工作人员的密码在数据库中是加密的. 步骤大致如下: 前台提交,后台获取登录信息,同数据库中的登陆信息进行比较,只不过工作人员是加密的,普通用 ...
随机推荐
- PostgreSQL 多版本的实现与Innodb和oracle的差别
PostgreSQL与oracle或InnoDB的多版本实现最大的区别在于最新版本和历史版本是否分离存储,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分离了数据,索引 ...
- CF938D Buy a Ticket dijkstra
考试T1,建一个反图跑一个最短路就好了~ code: #include <bits/stdc++.h> #define ll long long #define N 200002 #def ...
- TensorFlow(一):准备
我的环境:win10+python3.6.4(64位) 一:安装python 根据自己的电脑下载python(32位或者64位)-->安装教程 安装好python后记得配置pip源,使用官方的源 ...
- 爬虫(七):爬取猫眼电影top100
一:分析网站 目标站和目标数据目标地址:http://maoyan.com/board/4?offset=20目标数据:目标地址页面的电影列表,包括电影名,电影图片,主演,上映日期以及评分. 二:上代 ...
- Selenium操作Chrome模拟手机浏览器
目录 使用指定设备 使用自定义设备 在使用Chrome浏览网页时,我们可以使用Chrome开发者工具模拟手机浏览器,在使用Selenium操作Chrome时同样也可以模拟手机浏览器.主要有以下两种用途 ...
- PHP 之去除代码中的注释
测试文件代码如下: <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/10/16 * Time: 10:25 */ // 计算 ...
- ubuntu dnsmasq
/var/run/NetworkManager/resolv.conf 而你真实的dns服务器地址,是被这个服务管理维护着的/ local process -> local dnsmasq -& ...
- Oracle sql 复习题目总结
sql 题目一 表结构 1.表名:g_cardapply 字段(字段名/类型/长度): apply_no varchar8; //申请单号(关键字) apply_date date; //申请日期 s ...
- Macbook上打开多个终端的方法
方法有如下两种 1.首先是的焦点在终端上(使用鼠标点击下终端).然后使用快捷键command+N 即可得到另一个终端界面. (如果现在光标的焦点在浏览器上,那么就是新打开一个浏览器窗口) 2.同样,光 ...
- MAC常用快捷键 基本常用的都整理在这里了
写在前面Mac系统中有几个比较特殊的功能键,和Win系统的区别也主要在这里比如在Win系统中我们常用的Ctrl键,在Mac系统中对应的不是长得比较像的Cnotrol,而是Command键,貌似也是Ma ...