简介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的web框架中编写创建日志的程序的教程
Apr 30 Python
使用Python写CUDA程序的方法
Mar 27 Python
Python实现的求解最大公约数算法示例
May 03 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
python替换字符串中的子串图文步骤
Jun 19 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
python查看文件大小和文件夹内容的方法
Jul 08 Python
TensorFlow 显存使用机制详解
Feb 03 Python
python批量修改文件名的示例
Sep 27 Python
Python存储读取HDF5文件代码解析
Nov 25 Python
关于 Python json中load和loads区别
Nov 07 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
PHP5 安装方法
2007/01/15 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
python编程实现希尔排序
2017/04/13 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
python实现音乐下载器
2018/04/15 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
python实现IOU计算案例
2020/04/12 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
有创意的广告词
2014/03/18 职场文书
教师考核评语
2014/04/28 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android