举例讲解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 continue语句用法实例
Mar 11 Python
python实现telnet客户端的方法
Apr 15 Python
关于Python中异常(Exception)的汇总
Jan 18 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
使用keras实现非线性回归(两种加激活函数的方式)
Jul 05 Python
opencv 阈值分割的具体使用
Jul 08 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 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应用JSON技巧讲解
2013/02/03 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
prototype class详解
2006/09/07 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
2014/01/07 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
Python中的推导式使用详解
2015/06/03 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
python虚拟环境virualenv的安装与使用
2016/12/18 Python
简单的python后台管理程序
2017/04/13 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
python支持多继承吗
2020/06/19 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
写好自荐信的几个要点
2013/12/26 职场文书
教师校本培训方案
2014/02/26 职场文书
婚前协议书范本
2014/04/15 职场文书
酒店前台辞职书
2015/02/26 职场文书
员工表扬信怎么写
2015/05/05 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle