简介Python设计模式中的代理模式与模板方法模式编程


Posted in Python onFebruary 02, 2016

代理模式
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 相关文章推荐
Python中的自省(反射)详解
Jun 02 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
Python进程间通信之共享内存详解
Oct 30 Python
python如何去除字符串中不想要的字符
Jul 05 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
python 错误处理 assert详解
Apr 20 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
python实现简单的名片管理系统
Apr 26 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
python 爬取微信文章
Jan 30 #Python
python生成验证码图片代码分享
Jan 28 #Python
You might like
php中数据的批量导入(csv文件)
2006/10/09 PHP
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
深入浅析php json 格式控制
2015/12/24 PHP
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
解决python中 f.write写入中文出错的问题
2018/10/31 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Python: glob匹配文件的操作
2020/12/11 Python
中国最大的团购网站:聚划算
2016/09/21 全球购物
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
投标人法定代表人授权委托书格式
2014/09/28 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
js中Object.create实例用法详解
2021/10/05 Javascript