简介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实现目录树生成示例
Mar 28 Python
python处理html转义字符的方法详解
Jul 01 Python
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
python 读入多行数据的实例
Apr 19 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 Python
Python实现京东抢秒杀功能
Jan 25 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
mouse_on_title.js
2006/08/25 Javascript
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
JS 分号引起的一段调试问题
2009/06/18 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
react项目从新建到部署的实现示例
2021/02/19 Javascript
python实现的多线程端口扫描功能示例
2017/01/21 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
python numpy格式化打印的实例
2018/05/14 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
python实战教程之自动扫雷
2018/07/13 Python
python实现计算器简易版
2020/12/17 Python
python 实现图片裁剪小工具
2021/02/02 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
冰淇淋店创业计划书范文
2013/12/27 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
2019年亲子运动会口号
2019/10/11 职场文书