简介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中的map、reduce和filter浅析
Apr 26 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
python3中str(字符串)的使用教程
Mar 23 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
Python数据类型之String字符串实例详解
May 08 Python
python调用自定义函数的实例操作
Jun 26 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
python3获取当前目录的实现方法
Jul 29 Python
django实现支付宝支付实例讲解
Oct 17 Python
Python如何在DataFrame增加数值
Feb 14 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Python虚拟环境的创建和使用详解
Sep 07 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
php 定义404页面的实现代码
2012/11/19 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
如何让CI框架支持service层
2014/10/29 PHP
js自带函数备忘 数组
2006/12/29 Javascript
JS Timing
2007/04/21 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
Python 硬币兑换问题
2019/07/29 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
婚礼新郎父母答谢词
2014/01/16 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
迎新晚会邀请函
2014/02/01 职场文书
化学教学随笔感言
2014/02/19 职场文书
工地质量标语
2014/06/12 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
2014年督导工作总结
2014/11/19 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫