举例讲解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通过递归遍历出集合中所有元素的方法
Feb 25 Python
python复制与引用用法分析
Apr 08 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python简单定义与使用二叉树示例
May 11 Python
python实现音乐下载的统计
Jun 20 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 Python
python3+PyQt5+Qt Designer实现界面可视化
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自动生成印有用户信息的名片
2016/08/01 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
香港通票:Hong Kong Pass
2019/02/26 全球购物
教师档案管理制度
2014/01/23 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
给校长的一封建议书
2014/03/12 职场文书
2015年话务员工作总结
2015/04/29 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
Go语言编译原理之源码调试
2022/08/05 Golang