举例讲解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 相关文章推荐
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
django表单的Widgets使用详解
Jul 22 Python
python递归下载文件夹下所有文件
Aug 31 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
Python实现爬取并分析电商评论
Jun 19 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
教你如何使用Python Tkinter库制作记事本
Jun 10 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的简易冒泡法代码分享
2012/08/28 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
微信小程序开发探究
2016/12/27 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
JS实现滑动插件
2020/01/15 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
python绘制雪景图
2019/12/16 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
给孩子的新年寄语
2014/04/08 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2014年法院工作总结
2014/11/24 职场文书
汽车转让协议书
2015/01/29 职场文书
北京英文导游词
2015/02/12 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL
Java实现二分搜索树的示例代码
2022/03/17 Java/Android