简介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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
python中的字典使用分享
Jul 31 Python
python逆向入门教程
Jan 15 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
python异常处理和日志处理方式
Dec 24 Python
Python脚本去除文件的只读性操作
Mar 05 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
python实现学生通讯录管理系统
Feb 25 Python
Python 使用dict实现switch的操作
Apr 07 Python
浅析Python中的随机采样和概率分布
Dec 06 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
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php中动态修改ini配置
2014/10/14 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
解读Django框架中的低层次缓存API
2015/07/24 Python
python实现类之间的方法互相调用
2018/04/29 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
通过实例解析Python return运行原理
2020/03/04 Python
python实现TCP文件传输
2020/03/20 Python
python中rb含义理解
2020/06/18 Python
快速了解Python开发环境Spyder
2020/06/29 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
护士自我鉴定
2013/10/23 职场文书
九年级科学教学反思
2014/01/29 职场文书
小学毕业演讲稿
2014/04/25 职场文书
刑事案件上诉状
2015/05/23 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书