举例讲解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中装饰器高级用法详解
Dec 25 Python
pandas带有重复索引操作方法
Jun 08 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
Selenium的使用详解
Oct 19 Python
python pygame模块编写飞机大战
Nov 20 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
django框架cookie和session用法实例详解
Dec 10 Python
python中前缀运算符 *和 **的用法示例详解
May 28 Python
通过cmd进入python的步骤
Jun 16 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
python实现跨年表白神器--你值得拥有
Jan 04 Python
SpringBoot首页设置解析(推荐)
Feb 11 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数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
纯javascript版日历控件
2016/11/24 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
从零学Python之入门(五)缩进和选择
2014/05/27 Python
浅谈Python的异常处理
2016/06/19 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
Python3+Appium安装使用教程
2019/07/05 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
python matplotlib库的基本使用
2020/09/23 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
幼儿园教师的考核评语
2014/04/18 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
工地食品安全责任书
2015/05/09 职场文书
军事博物馆观后感
2015/06/05 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
centos8安装MongoDB的详细过程
2021/10/24 MongoDB