举例讲解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插入排序算法的实现代码
Nov 21 Python
Python操作SQLite简明教程
Jul 10 Python
在Python的Django框架下使用django-tagging的教程
May 30 Python
图文详解WinPE下安装Python
May 17 Python
如何用itertools解决无序排列组合的问题
May 18 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
python实现各种插值法(数值分析)
Jul 30 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
如何在django中运行scrapy框架
Apr 22 Python
python中filter,map,reduce的作用
Jun 10 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
Python创建数字列表的示例
2019/11/28 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
深入分析python 排序
2020/08/24 Python
Python用Jira库来操作Jira
2020/12/28 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
Java基础面试题
2014/07/19 面试题
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技