举例讲解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 14 Python
Python Flask基础教程示例代码
Feb 07 Python
基于随机梯度下降的矩阵分解推荐算法(python)
Aug 31 Python
python查看模块,对象的函数方法
Oct 16 Python
Python运维开发之psutil库的使用详解
Oct 18 Python
Python字符串的全排列算法实例详解
Jan 07 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
python绘制箱型图
Apr 27 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实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
htm调用JS代码
2007/03/15 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
21行Python代码实现拼写检查器
2016/01/25 Python
Python 通配符删除文件的实例
2018/04/24 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
django 类视图的使用方法详解
2019/07/24 Python
python支付宝支付示例详解
2019/08/22 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
wxPython实现画图板
2020/08/27 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
机电一体化专业推荐信
2013/12/03 职场文书
护士岗位职责
2014/02/16 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
服务承诺口号
2014/05/22 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书