举例讲解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压平嵌套列表的简单实现
Jun 08 Python
Python 含参构造函数实例详解
May 25 Python
python 从csv读数据到mysql的实例
Jun 21 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
使用python实现滑动验证码功能
Aug 05 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
python录音并调用百度语音识别接口的示例
Dec 01 Python
如何用Python搭建gRPC服务
Jun 30 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
PHP无限分类(树形类)
2013/09/28 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
php实现数字补零的方法总结
2018/09/12 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
英国在线泳装店:Simply Swim
2019/05/05 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
党员对照检查材料
2014/09/22 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
JavaScript设计模式之原型模式详情
2022/06/21 Javascript