举例讲解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 相关文章推荐
PyMongo安装使用笔记
Apr 27 Python
bat和python批量重命名文件的实现代码
May 19 Python
Python日期的加减等操作的示例
Aug 15 Python
python入门教程 python入门神图一张
Mar 05 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
pandas的qcut()方法详解
Jul 06 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
浅析Python 引号、注释、字符串
Jul 25 Python
pytest中文文档之编写断言
Sep 12 Python
python中的插入排序的简单用法
Jan 19 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无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
php实现socket推送技术的示例
2017/12/20 PHP
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
Python生成不重复随机值的方法
2015/05/11 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Python编码类型转换方法详解
2016/07/01 Python
Django内容增加富文本功能的实例
2017/10/17 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
Python 爬虫的原理
2020/07/30 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
Android笔试题总结
2014/11/29 面试题
元旦联欢会主持词
2014/03/26 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
运动会5000米加油稿
2015/07/21 职场文书
办公室规章制度范本
2015/08/04 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers