举例讲解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常见字典内建函数用法示例
May 14 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
python opencv如何实现图片绘制
Jan 19 Python
Python调用Windows命令打印文件
Feb 07 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
python基于turtle绘制几何图形
Jun 15 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
js 省地市级联选择
2010/02/07 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
化妆师职业生涯规划书
2014/02/16 职场文书
对孩子的寄语
2014/04/09 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
庐山导游词
2015/02/03 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
被告答辩状范文
2015/05/22 职场文书
调解协议书范本
2016/03/21 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python