简介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 迭代器和iter()函数详解及实例
Mar 21 Python
Python引用传值概念与用法实例小结
Oct 07 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
django中的HTML控件及参数传递方法
Mar 20 Python
Django中的文件的上传的几种方式
Jul 23 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
python list的index()和find()的实现
Nov 16 Python
python安装sklearn模块的方法详解
Nov 28 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
python绘制箱型图
Apr 27 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
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
把字符串按照特定的字母顺序进行排序的js代码
2014/01/28 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
vue实现分页栏效果
2019/06/28 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
python的sorted用法详解
2019/06/25 Python
jupyter实现重新加载模块
2020/04/16 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
佳能法国商店:Canon法国
2019/02/14 全球购物
管理科学大学生求职信
2013/11/13 职场文书
党员教师工作决心书
2014/03/13 职场文书
公司转让协议书
2016/03/19 职场文书