简介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和bash统计CPU利用率的方法
Jul 10 Python
python中redis的安装和使用
Dec 04 Python
Python线程指南详细介绍
Jan 05 Python
详解使用 pyenv 管理多个版本 python 环境
Oct 19 Python
Python及PyCharm下载与安装教程
Nov 18 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
python矩阵的转置和逆转实例
Dec 12 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
Aug 24 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分页显示制作详细讲解
2006/10/09 PHP
Discuz 模板引擎的封装类代码
2008/07/18 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
webpack优化的深入理解
2018/12/10 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python contextlib模块使用示例
2015/02/18 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Python优先队列实现方法示例
2017/09/21 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
python实现最长公共子序列
2018/05/22 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
Python类的动态绑定实现原理
2020/03/21 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
计算机专业学生求职信分享
2013/12/15 职场文书
秋季运动会加油稿200字
2014/01/11 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
生日宴会主持词
2014/03/20 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL