举例讲解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 实现归并排序算法
Jun 05 Python
Python中生成器和yield语句的用法详解
Apr 17 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python SocketServer源码深入解读
Sep 17 Python
python3图片文件批量重命名处理
Oct 31 Python
python plotly画柱状图代码实例
Dec 13 Python
Python JSON编解码方式原理详解
Jan 20 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
Python 在局部变量域中执行代码
Aug 07 Python
谈谈python垃圾回收机制
Sep 27 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
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
讲解Python中运算符使用时的优先级
2015/05/14 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
表彰先进的通报
2014/01/31 职场文书
法人授权委托书样本
2014/09/19 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
刑事附带民事代理词
2015/05/25 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
如何使用CocosCreator对象池
2021/04/14 Javascript