举例讲解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 10 Python
Python解惑之整数比较详解
Apr 24 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
Python正则表达式和re库知识点总结
Feb 11 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
python flask几分钟实现web服务的例子
Jul 26 Python
Python 共享变量加锁、释放详解
Aug 28 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
Jan 12 Python
python基于opencv 实现图像时钟
Jan 04 Python
Django程序的优化技巧
Apr 29 Python
python实现自定义日志的具体方法
May 28 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编程 SSO详细介绍及简单实例
2017/01/13 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
JavaScript中的闭包原理分析
2010/03/08 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python字典多条件排序方法实例
2014/06/30 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
pycharm设置注释颜色的方法
2018/05/23 Python
详解python的super()的作用和原理
2020/10/29 Python
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
linux面试题参考答案(8)
2015/08/11 面试题
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
中医临床专业自我鉴定范文
2014/01/15 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
新手入门Mysql--概念
2021/06/18 MySQL
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python