举例讲解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代码制作configure文件示例
Jul 28 Python
Python第三方库的安装方法总结
Jun 06 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
Pytorch入门之mnist分类实例
Apr 14 Python
如何在Python中实现goto语句的方法
May 18 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
基于Pytorch SSD模型分析
Feb 18 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
使用numpy nonzero 找出非0元素
May 14 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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
怎么使 Mysql 数据同步
2006/10/09 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
js中关于String对象的replace使用详解
2011/05/24 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
Vue动态生成表格的行和列
2019/07/18 Javascript
Python编程中装饰器的使用示例解析
2016/06/20 Python
python获取服务器响应cookie的实例
2018/12/28 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
计算机求职信
2013/12/01 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
求职信格式要求
2014/05/23 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
解除租房协议书
2014/12/03 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
2016年元旦主持词
2015/07/06 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle
Docker安装MySql8并远程访问的实现
2022/07/07 Servers