举例讲解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脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
Python 数据结构之队列的实现
Jan 22 Python
python2.7实现爬虫网页数据
May 25 Python
python获取代码运行时间的实例代码
Jun 11 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
Python中文件的写入读取以及附加文字方法
Jan 23 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
Dec 12 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
Python虚拟环境venv用法详解
May 25 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
python多线程扫描端口示例
2014/01/16 Python
python爬虫的工作原理
2017/03/05 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
Python3 修改默认环境的方法
2019/02/16 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
生产经理的自我评价分享
2013/11/07 职场文书
义诊活动总结
2015/02/04 职场文书
大学生求职信怎么写
2015/03/19 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
市场营销计划书
2019/04/24 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers