简介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 可爱的大小写
Sep 06 Python
Python切片用法实例教程
Sep 08 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python中的fileinput模块的简单实用示例
Jul 09 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
pandas 转换成行列表进行读取与Nan处理的方法
Oct 30 Python
详解Python正则表达式re模块
Mar 19 Python
python之信息加密题目详解
Jun 26 Python
Tensorflow 多线程设置方式
Feb 06 Python
浅析Python 多行匹配模式
Jul 24 Python
Python爬虫代理池搭建的方法步骤
Sep 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函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
PHP中phar包的使用教程
2017/06/14 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
python实现人脸识别代码
2017/11/08 Python
详解Python如何生成词云的方法
2018/06/01 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
python redis 删除key脚本的实例
2019/02/19 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
Structs界面控制层技术
2013/10/11 面试题
门诊手术室工作制度
2014/01/30 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
维稳工作情况汇报
2014/10/27 职场文书
党的群众路线调研报告
2014/11/03 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL