举例讲解Python设计模式编程的代理模式与抽象工厂模式


Posted in Python onJanuary 16, 2016

代理模式
Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介

你先设想:一个对象提供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()

抽象工厂模式
和简单工厂/工厂方法不同,抽象工厂可能最好理解,举个例子:
比如2个动物,猫和狗,他们都有speak和eat的function,但是很明显他们执行的结果是不同的 有个'工厂'(抽象工厂里面一个类型就是一个工厂,这点和其他模式的不同)专门帮助我们找到对应的动物做正确的操作 有个类/函数可以通过参数帮助我们找到上面的这个工厂  这就是抽象工厂

from abc import ABCMeta

class StandardFactory(object):
  '''这就是那个抽象工厂'''
  @staticmethod
  def get_factory(factory):
    '''根据参数找到对实际操作的工厂'''
    if factory == 'cat':
      return CatFactory()
    elif factory == 'dog':
      return DogFactory()
    raise TypeError('Unknown Factory.')


这里帮助dog这个产品类找到应该的属性的工厂
class DogFactory(object):
  def get_pet(self):
    return Dog();


class CatFactory(object):
  # 注意这个方法和上面的名字一样,但是返回的类不同,这就是工厂的作用
  def get_pet(self):
    return Cat();


# 可以认为dog和cat都是动物的一种,可以有个基类
class Pet(object):
  # ABCMeta会让这个类在注册后添加很多基础抽象基类,可以看[ABCMeta](http://docs.python.org/2/library/abc.html#abc.ABCMeta)
  __metaclass__ = ABCMeta
  def eat(self):
    pass


# Dog应该做什么就是这里
class Dog(Pet):
  def eat(self):
    return 'Dog food...'


class Cat(Pet):
  # 这里的eat依然是同名,她们都是同样的操作,只是返回不同
  def eat(self):
    return 'Cat food...'


if __name__ =="__main__":
  factory = StandardFactory.get_factory('cat')
  pet = factory.get_pet()
  print pet.eat()

  # 注意这里,你只需要修改抽象工厂传入的那个参数,其他什么都不用改
  factory = StandardFactory.get_factory('dog')
  pet = factory.get_pet()
  print pet.eat()
Python 相关文章推荐
Python动态加载模块的3种方法
Nov 22 Python
Python实现竖排打印传单手机号码易撕条
Mar 16 Python
Python计算一个文件里字数的方法
Jun 15 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python实现Virginia无密钥解密
Mar 20 Python
Python DataFrame一列拆成多列以及一行拆成多行
Aug 06 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
利用Python过滤相似文本的简单方法示例
Feb 03 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 Python
python实现发送和获取手机短信验证码
Jan 15 #Python
详解python单例模式与metaclass
Jan 15 #Python
理解python正则表达式
Jan 15 #Python
Python工程师面试题 与Python Web相关
Jan 14 #Python
Python工程师面试题 与Python基础语法相关
Jan 14 #Python
5种Python单例模式的实现方式
Jan 14 #Python
Python2.x与Python3.x的区别
Jan 14 #Python
You might like
PHP SQLite类
2009/05/07 PHP
PHP 简单日历实现代码
2009/10/28 PHP
PHP小教程之实现链表
2014/06/09 PHP
php文件缓存方法总结
2016/03/16 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
js获取单选框或复选框值及操作
2012/12/18 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
九种原生js动画效果
2015/11/11 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
python自定义类并使用的方法
2015/05/07 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
pytorch打印网络结构的实例
2019/08/19 Python
python程序 创建多线程过程详解
2019/09/23 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
农业大学毕业生的个人自我评价
2013/10/11 职场文书
应用化学专业职业生涯规划书
2013/12/31 职场文书
护理专业自荐信范文
2014/02/26 职场文书
党员查摆剖析材料
2014/10/10 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript