简介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脚本来获取Google搜索结果的示例
May 04 Python
浅谈Python的文件类型
May 30 Python
快速入手Python字符编码
Aug 03 Python
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
python将unicode转为str的方法
Jun 21 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
python文件和文件夹复制函数
Feb 07 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 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
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
2016/05/27 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
浅谈webpack和webpack-cli模块源码分析
2020/01/19 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
python中K-means算法基础知识点
2021/01/25 Python
院药学专业个人求职信
2013/09/21 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
社区班子对照检查材料
2014/08/27 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
学生打架检讨书
2014/10/20 职场文书
2015选调生工作总结
2015/07/24 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
Python基本数据类型之字符串str
2021/07/21 Python