简介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中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
实例说明Python中比较运算符的使用
May 13 Python
Python中atexit模块的基本使用示例
Jul 08 Python
深入解读Python解析XML的几种方式
Feb 16 Python
Python中单例模式总结
Feb 20 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
python计算导数并绘图的实例
Feb 29 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
珊瑚虫IP库浅析
2007/02/15 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python 生成目录树及显示文件大小的代码
2009/07/23 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
python opencv调用笔记本摄像头
2019/08/28 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
python实现简单井字棋小游戏
2020/03/05 Python
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
资料员岗位职责
2013/11/17 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
单位工作证明
2014/10/07 职场文书
财政局个人总结
2015/03/04 职场文书
任命通知范文
2015/04/21 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
如何写好开幕词?
2019/06/24 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL
详解Laravel制作API接口
2021/05/31 PHP
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python