举例讲解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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
深入浅析Python字符编码
Nov 12 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
python卸载后再次安装遇到的问题解决
Jul 10 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
Python selenium爬取微博数据代码实例
May 22 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
python实现计算图形面积
Feb 22 Python
编写python程序的90条建议
Apr 14 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中抽象类和接口的概念以及区别
2013/06/27 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
创建卫生先进单位实施方案
2014/03/10 职场文书
专业技术职务聘任书
2014/03/29 职场文书
仓库文员岗位职责
2014/04/06 职场文书
预备党员综合考察材料
2014/05/31 职场文书
趣味运动会简讯
2015/07/20 职场文书
朋友离别感言
2015/08/04 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
javascript实现计算器功能详解流程
2021/11/01 Javascript