简介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应用的教程
Apr 16 Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
Python实现简单的列表冒泡排序和反转列表操作示例
Jul 10 Python
pytorch 共享参数的示例
Aug 17 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
Python中的特殊方法以及应用详解
Sep 20 Python
用Python写一个简易版弹球游戏
Apr 13 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 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根据分类合并数组的方法实例详解
2013/11/06 PHP
php中namespace use用法实例分析
2016/01/22 PHP
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python队列的定义与使用方法示例
2017/06/24 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
python交易记录链的实现过程详解
2019/07/03 Python
Python的条件锁与事件共享详解
2019/09/12 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
银行实习的自我鉴定
2013/12/10 职场文书
党建目标管理责任书
2014/07/25 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
商务信函英语问候语
2015/11/10 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android