举例讲解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基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
详解Python 函数如何重载?
Apr 23 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
python如何将两个txt文件内容合并
Oct 18 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
Python之字典对象的几种创建方法
Sep 30 Python
python实现控制台输出颜色
Mar 02 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 分页类 扩展代码
2009/06/11 PHP
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
PHP获取url的函数代码
2011/08/02 PHP
php简单日历函数
2015/10/28 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
浅谈js原生拖放
2016/11/21 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
2018/09/04 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
商场主管竞聘书
2014/03/31 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
技术股份合作协议书
2014/10/05 职场文书
岗位聘任报告
2015/03/02 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
积极心理学课程心得体会
2016/01/22 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL