举例讲解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 相关文章推荐
Python解析树及树的遍历
Feb 03 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
Python对List中的元素排序的方法
Apr 01 Python
Python sorted函数详解(高级篇)
Sep 18 Python
利用Django模版生成树状结构实例代码
May 19 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
Python generator生成器和yield表达式详解
Aug 08 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
Python JSON编解码方式原理详解
Jan 20 Python
python如何使用代码运行助手
Jul 03 Python
Python reversed反转序列并生成可迭代对象
Oct 22 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php动态生成JavaScript代码
2009/03/09 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
浅析Python中的多重继承
2015/04/28 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
在python shell中运行python文件的实现
2019/12/21 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
运动员获奖感言
2014/08/15 职场文书