举例讲解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引用(import)文件夹下的py文件的方法
Aug 26 Python
利用python批量检查网站的可用性
Sep 09 Python
python 猴子补丁(monkey patch)
Jun 26 Python
python实现自动化上线脚本的示例
Jul 01 Python
Python实现Selenium自动化Page模式
Jul 14 Python
详解Python self 参数
Aug 30 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
Pytest mark使用实例及原理解析
Feb 22 Python
python selenium操作cookie的实现
Mar 18 Python
Django分组聚合查询实例分享
Apr 29 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
Python 匹配文本并在其上一行追加文本
May 11 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
jquery实现网页查找功能示例分享
2014/02/12 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
Python的多态性实例分析
2015/07/07 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
python方向键控制上下左右代码
2018/01/20 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
Python @property装饰器原理解析
2020/01/22 Python
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
消防先进事迹材料
2014/02/10 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
送达通知书
2015/04/25 职场文书
施工安全保证书
2015/05/09 职场文书
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers