简介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调用cmd命令行制作刷博器
Jan 13 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
python中pylint使用方法(pylint代码检查)
Apr 06 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
Python Numpy计算各类距离的方法
Jul 05 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
tensorflow自定义激活函数实例
Feb 04 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
python输出国际象棋棋盘的实例分享
Nov 26 Python
python执行js代码的方法
May 13 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
thinkphp整合微信支付代码分享
2016/11/24 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
javascript控制台详解
2015/06/25 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
JSONP基础知识详解
2017/03/19 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
Python实现多线程抓取妹子图
2015/08/08 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
对Python 内建函数和保留字详解
2018/10/15 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
介绍一下linux的文件权限
2014/07/20 面试题
村优秀党员事迹材料
2014/01/15 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
购房委托书范本
2014/09/18 职场文书
营业员岗位职责范本
2015/04/14 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python