简介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编写一个每天都在系统下新建一个文件夹的脚本
May 04 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
对python列表里的字典元素去重方法详解
Jan 21 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
Python 静态方法和类方法实例分析
Nov 21 Python
Python内置类型性能分析过程实例
Jan 29 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 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 checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
php cli配置文件问题分析
2015/10/15 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
jQuery事件详解
2017/02/23 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
2018/07/13 jQuery
Promise.all中对于reject的处理方法
2018/08/01 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
Python聚类算法之基本K均值实例详解
2015/11/20 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
通过代码实例了解Python sys模块
2020/09/14 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
罗技英国官方网站:Logitech UK
2020/11/03 全球购物
少儿节目主持串词
2014/04/02 职场文书
伦敦奥运会口号
2014/06/13 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
教师见习报告范文
2014/11/03 职场文书
节水倡议书
2015/01/19 职场文书
庐山导游词
2015/02/03 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
升职自荐书
2019/05/09 职场文书
解析目标检测之IoU
2021/06/26 Python
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL