举例讲解Python中的Null模式与桥接模式编程


Posted in Python onFebruary 02, 2016

Null模式
我想每个人都有一种经历,为了获取某属性,但是有时候属性是None,那么需要你做异常处理, 而假如你想节省这样的条件过滤的代码,可以使用Null模式以减少对象是否为None的判断

python的例子
我举个不是很通用的例子,只是为了让大家理解这个模式:我有很多类, 但是不是每个类都有类方法test,所以我调用类方法就要做个异常处理,类似这样

class A(object):
  pass

class B(object):
  b = 1
  @classmethod
  def test(cls):
    print cls.b

def get_test(x):
  try:
    return x.test
  except AttributeError: 
    return None

# 我这里只写了2个类,但是其实有很多类
for i in [A, B]:
  test = get_test(i)
  # 我要判断以下是否获得了这个类方法才能决定是否可以执行
  if test:
    test()

但是我用Null方法就可以这样

class Null(object):

  def __init__(self, *args, **kwargs):
    "忽略参数"
    return None

  def __call__(self, *args, **kwargs):
    "忽略实例调用"
    return self

  def __getattr__(self, mname):
    "忽略属性获得"
    return self

  def __setattr__(self, name, value):
    "忽略设置属性操作"
    return self

  def __delattr__(self, name):
    '''忽略删除属性操作'''
    return self

  def __repr__(self):
    return "<Null>"

  def __str__(self):
    return "Null"

还是上面的功能

class Null(object):

  def __init__(self, *args, **kwargs):
    "忽略参数"
    return None

  def __call__(self, *args, **kwargs):
    "忽略实例调用"
    return self

  def __getattr__(self, mname):
    "忽略属性获得"
    return self

  def __setattr__(self, name, value):
    "忽略设置属性操作"
    return self

  def __delattr__(self, name):
    '''忽略删除属性操作'''
    return self

  def __repr__(self):
    return "<Null>"

  def __str__(self):
    return "Null"

桥接模式
这个模式其实就是把产品类的实现和抽象类分离,能够灵活的变化,假如你记得状态模式,它是修改内部属性, 而桥接模式是指定好内部属性,每个产品类指定这个属性被桥接模式类调用,适用于产品类可能经常调整变化,这样还能减少了产品类之间的耦合

python的例子
这里实现一个打印操作系统名字的功能

class Bridge(object):

  def __init__(self):
    self.__implementation = None

  def someFunctionality(self):
    raise NotImplemented()

class UseCase1(Bridge):
  # 根据初始化参数传入实现的产品类
  def __init__(self, implementation):
    self.__implementation = implementation
  # 根据传入的产品类的属性打印结果
  def someFunctionality(self):
    print "UseCase1: ",
    self.__implementation.anotherFunctionality()


class UseCase2(Bridge):
  def __init__(self, implementation):
    self.__implementation = implementation

  def someFunctionality(self):
    print "UseCase2: ",
    self.__implementation.anotherFunctionality()


class ImplementationInterface:

  def anotherFunctionality(self):
    raise NotImplemented

# 这里其实才是实现的产品类
class Linux(ImplementationInterface):

  # 它定义了这个方法,回应操作系统的名字
  def anotherFunctionality(self):
    print "Linux!"


class Windows(ImplementationInterface):
  def anotherFunctionality(self):
    print "Windows."


def main():
  linux = Linux()
  windows = Windows()

  useCase = UseCase1(linux)
  useCase.someFunctionality()

  useCase = UseCase1(windows)
  useCase.someFunctionality()

  useCase = UseCase2(linux)
  useCase.someFunctionality()

  useCase = UseCase2(windows)
  useCase.someFunctionality()


if __name__ == "__main__":
  main()
Python 相关文章推荐
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
python实现图片批量压缩程序
Jul 23 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
如何通过python画loss曲线的方法
Jun 26 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
Python 等分切分数据及规则命名的实例代码
Aug 16 Python
python双向链表原理与实现方法详解
Dec 03 Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
python语言中pandas字符串分割str.split()函数
Aug 05 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 #Python
Python找出9个连续的空闲端口
Feb 01 #Python
Python 爬虫的工具列表大全
Jan 31 #Python
python在不同层级目录import模块的方法
Jan 31 #Python
在Python中移动目录结构的方法
Jan 31 #Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 #Python
python 爬取微信文章
Jan 30 #Python
You might like
php echo 输出字符串函数详解
2010/05/13 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
php生成随机颜色方法汇总
2014/12/03 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
javascript 隔行换色函数代码
2010/10/24 Javascript
js精度溢出解决方案
2012/12/02 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
javascript表单验证大全
2015/08/12 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
实例解析Array和String方法
2016/12/14 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
2017/02/22 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
python super用法及原理详解
2020/01/20 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
个人现实表现材料
2014/02/04 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
诉讼授权委托书
2014/10/15 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python