举例讲解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每次处理固定个数的字符的方法总结
Jan 29 Python
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
Python科学计算环境推荐——Anaconda
Jun 30 Python
Python文件操作基本流程代码实例
Dec 11 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
Jan 08 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
python批量处理文件或文件夹
Jul 28 Python
python字典key不能是可以是啥类型
Aug 04 Python
Python request中文乱码问题解决方案
Sep 17 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 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实现的生成静态HTML速度快类库
2007/03/31 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
部队学习十八大感言
2014/01/11 职场文书
战友聚会邀请函
2014/01/18 职场文书
计算机网络专业求职信
2014/06/05 职场文书
应届生找工作求职信
2014/06/24 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
医院营销工作计划
2015/01/16 职场文书
薪资证明范本
2015/06/19 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
golang定时器
2022/04/14 Golang
vue动态绑定style样式
2022/04/20 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js