举例讲解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的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
浅谈python写入大量文件的问题
Nov 09 Python
python项目对接钉钉SDK的实现
Jul 15 Python
Python学习笔记之While循环用法分析
Aug 14 Python
Python3进制之间的转换代码实例
Aug 24 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
用Python将GIF动图分解成多张静态图片
Jun 11 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
js选项卡的制作方法
2017/01/23 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
Python实现的Excel文件读写类
2015/07/30 Python
Python正则捕获操作示例
2017/08/19 Python
Python实现自动上京东抢手机
2018/02/06 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
Python列表(List)知识点总结
2019/02/18 Python
Django实现内容缓存实例方法
2020/06/30 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
C语言编程题
2015/03/09 面试题
大学生实习自我鉴定
2013/12/11 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
党课心得体会范文
2014/09/09 职场文书
2014年城管工作总结
2014/11/20 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
纯html+css实现打字效果
2021/08/02 HTML / CSS
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers