举例讲解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 相关文章推荐
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 Python
Django的session中对于用户验证的支持
Jul 23 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Python3中函数参数传递方式实例详解
May 05 Python
基于python if 判断选择结构的实例详解
May 06 Python
python字符串中匹配数字的正则表达式
Jul 03 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
javascript 获取表单file全路径
2009/12/31 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
python日期相关操作实例小结
2019/06/24 Python
python常用函数与用法示例
2019/07/02 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
HTML5 Canvas概述
2009/08/26 HTML / CSS
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
怎样声明一个匿名的内部类
2016/06/01 面试题
《小熊住山洞》教学反思
2014/02/21 职场文书
2014高考励志标语
2014/06/05 职场文书
影子教师研修方案
2014/06/14 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
2014年工程工作总结
2014/11/25 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python