举例讲解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使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
python获取服务器响应cookie的实例
Dec 28 Python
python贪吃蛇游戏代码
Apr 18 Python
python正则-re的用法详解
Jul 28 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
pytorch DataLoader的num_workers参数与设置大小详解
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
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
详解javascript函数的参数
2015/11/10 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
微信小程序定位当前城市的方法
2018/07/19 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
urllib2自定义opener详解
2014/02/07 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
使用python绘制常用的图表
2016/08/27 Python
利用python求相邻数的方法示例
2017/08/18 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
python实现批量文件重命名
2019/10/31 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
2014年保育员个人工作总结
2014/12/02 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP