举例讲解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环境安装教程
Jul 13 Python
DataFrame中的object转换成float的方法
Apr 10 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
python 调用钉钉机器人的方法
Feb 20 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
Django 如何实现文件上传下载
Apr 08 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 Python
python中pandas对多列进行分组统计的实现
Jun 18 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下对数组进行排序的函数
2010/08/08 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
php修改数组键名的方法示例
2017/04/15 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
在Javascript中定义对象类别
2006/12/22 Javascript
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
Vue数据绑定简析小结
2019/05/07 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
Python中的id()函数指的什么
2017/10/17 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
Farah官方网站:男士服装及配件
2019/11/01 全球购物
远程教育心得体会
2014/01/03 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
工作检讨书500字
2014/10/19 职场文书
银行实习推荐信
2015/03/27 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技