NULL Object模式
2014-09-11 10:20
169 查看
NULL Object,这是个很简单又很有趣的模式。
先看一段代码:
上面是一段伪代码,比如我们要创建一个图片,CreatePicture有两种基本的返回类型,创建成功了,则返回一个图片对象,如果创建失败了,则返回一个NULL指针。
类似的这种代码应该是很常见的。
那么当我们需要调用的时候,往往是这样:
返回这一定要判断一下,只有非空情况才继续,如不判断调用draw()的话,可能就crash。
如果CreatePicture被调用的很频繁,那么每次加上if (pic)是不是很烦?
这里就有个技巧,我们可以创建一个NULL object,比如:
然后CreatePicture改成:
也就是说CreatePicture保证不会返回一个NULL指针。这样,调用的时候就无需判断了。
直接调用draw就行,如果返回的是一个Png对象,那么draw就会画图片,如果返回的是NullPicture对象,draw就啥都不做。
总结:NULL Object是一个很简单的模式,但是有时也挺有效。
好处:调用的时候,可以省去判断代码。代码看起来比较简洁。
坏处:开销肯定多了,就算失败也得调用draw函数。这个就是额外的开销。包括内存开销(NullPicture对象),虚函数调用导致的多态开销等等。
先看一段代码:
Picture* CreatePicture() { if (failed) return NULL; else return new Png(); }
上面是一段伪代码,比如我们要创建一个图片,CreatePicture有两种基本的返回类型,创建成功了,则返回一个图片对象,如果创建失败了,则返回一个NULL指针。
类似的这种代码应该是很常见的。
那么当我们需要调用的时候,往往是这样:
Picture* pic = CreatePicture(); if (pic) { pic->draw(); }
返回这一定要判断一下,只有非空情况才继续,如不判断调用draw()的话,可能就crash。
如果CreatePicture被调用的很频繁,那么每次加上if (pic)是不是很烦?
这里就有个技巧,我们可以创建一个NULL object,比如:
class NullPicture: public Picture { public: void draw(){} }
然后CreatePicture改成:
Picture* CreatePicture() { if (failed) return new NullPicture(); else return new Png(); }
也就是说CreatePicture保证不会返回一个NULL指针。这样,调用的时候就无需判断了。
Picture* pic = CreatePicture(); pic->draw();
直接调用draw就行,如果返回的是一个Png对象,那么draw就会画图片,如果返回的是NullPicture对象,draw就啥都不做。
总结:NULL Object是一个很简单的模式,但是有时也挺有效。
好处:调用的时候,可以省去判断代码。代码看起来比较简洁。
坏处:开销肯定多了,就算失败也得调用draw函数。这个就是额外的开销。包括内存开销(NullPicture对象),虚函数调用导致的多态开销等等。
相关文章推荐
- Null Object设计模式
- Null Object 设计模式
- GoF著作中未提到的设计模式(3):Null Object
- 设计模式:空对象模式(Null Object Pattern)
- Null Object模式
- 设计模式:空对象模式(Null Object Pattern)
- 【设计模式系列】行为型模式之Null Object模式
- Null Object 模式
- GoF著作中未提到的设计模式之三:Null Object
- 设计模式笔记之 - NULL OBJECT
- NULL OBJECT 模式
- 五. Null Object模式
- GoF著作中未提到的设计模式(3):Null Object
- 设计模式外传——NULL OBJECT模式
- Null Object 模式和实现
- 使用Null Object设计模式
- NULL OBJECT模式
- 【设计模式攻略】行为型模式之Null Object模式
- 开发趣事(2)--从NULL Object模式谈起
- Null Object 模式之我见