举例讲解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 08 Python
Python 实现简单的电话本功能
Aug 09 Python
python如何实现内容写在图片上
Mar 23 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
python函数超时自动退出的实操方法
Dec 28 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
Python编写nmap扫描工具
Jul 21 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函数代码
2010/04/22 PHP
PHP 时间日期操作实战
2011/08/26 PHP
php中如何执行linux命令详解
2018/11/06 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
vue注册组件的几种方式总结
2018/03/08 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
Python中数字以及算数运算符的相关使用
2015/10/12 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
jupyter notebook实现显示行号
2020/04/13 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
会计专业个人求职信范文
2014/01/08 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
高三毕业评语
2014/12/31 职场文书
水电工程师岗位职责
2015/02/13 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书