举例讲解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使用gensim计算文档相似性
Apr 10 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
详解python-图像处理(映射变换)
Mar 22 Python
python sort、sort_index方法代码实例
Mar 28 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
对Python 字典元素进行删除的方法
Jul 31 Python
如何用 Python 制作一个迷宫游戏
Feb 25 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
python神经网络 使用Keras构建RNN训练
May 04 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 zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
js 函数性能比较方法
2020/08/24 Javascript
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
应聘护士自荐信
2013/10/21 职场文书
预备党员转正思想汇报
2014/01/12 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
服装设计师求职信
2014/06/04 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
技术入股合作协议书
2016/03/21 职场文书
导游词之青城山景区
2019/09/27 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers
JavaScript实例 ODO List分析
2022/01/22 Javascript