简介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实现的石头剪子布代码分享
Aug 22 Python
Python 创建子进程模块subprocess详解
Apr 08 Python
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
python实现的简单文本类游戏实例
Apr 28 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
在Python中使用gRPC的方法示例
Aug 08 Python
python使用KNN算法识别手写数字
Apr 25 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
python轮询机制控制led实例
May 03 Python
python模板入门教程之flask Jinja
Apr 11 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
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
js的OOP继承实现(必看篇)
2017/02/18 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
Python动态加载模块的3种方法
2014/11/22 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
python实现读取大文件并逐行写入另外一个文件
2018/04/19 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
python使用knn实现特征向量分类
2018/12/26 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
电子商务专业应届生求职信
2014/05/28 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
初三英语教学计划
2015/01/23 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
Django中session进行权限管理的使用
2021/07/09 Python
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers