举例讲解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使用xauth方式登录饭否网然后发消息
Apr 11 Python
Python中os.path用法分析
Jan 15 Python
python实现给scatter设置颜色渐变条colorbar的方法
Dec 13 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Python pandas用法最全整理
Aug 04 Python
Python 共享变量加锁、释放详解
Aug 28 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
基于python实现对文件进行切分行
Apr 26 Python
python中xlutils库用法浅析
Dec 29 Python
如何用 Python 处理不平衡数据集
Jan 04 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
linux下编译安装memcached服务
2014/08/03 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
python生成随机mac地址的方法
2015/03/16 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
基于Python实现文件大小输出
2016/01/11 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
Python 列表理解及使用方法
2017/10/27 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
Django logging配置及使用详解
2019/07/23 Python
python中常用的数据结构介绍
2021/01/12 Python
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
经典C++面试题一
2016/11/06 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
管理科学大学生求职信
2013/11/13 职场文书
园林设计专业毕业生求职信
2014/03/23 职场文书
岗位聘任书范文
2014/03/29 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
地球上的星星观后感
2015/06/02 职场文书
收入证明范本
2015/06/12 职场文书
仓库管理制度范本
2015/08/04 职场文书
Python实现日志实时监测的示例详解
2022/04/06 Python
Tomcat配置访问日志和线程数
2022/05/06 Servers