举例讲解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随机生成彩票号码的方法
Mar 05 Python
python制作一个桌面便签软件
Aug 09 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
Python实现Youku视频批量下载功能
Mar 14 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
Python类如何定义私有变量
Feb 03 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
Python Opencv图像处理基本操作代码详解
Aug 31 Python
Python利用folium实现地图可视化
May 23 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
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
php实现的通用图片处理类
2015/03/24 PHP
基于php编程规范(详解)
2017/08/17 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
python写入中英文字符串到文件的方法
2015/05/06 Python
Python3中列表list合并的四种方法
2019/04/19 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
公务员职务工作的自我评价
2013/11/01 职场文书
自我评价如何写好?
2014/01/05 职场文书
五年级音乐教学反思
2014/02/06 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
中文专业求职信
2014/06/20 职场文书
学校联谊协议书
2014/09/16 职场文书
解除租房协议书
2014/12/03 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript