设为首页 加入收藏

TOP

NULL Object模式
2015-07-20 17:41:11 来源: 作者: 【 】 浏览:1
Tags:NULL Object 模式

NULL Object,这是个很简单又很有趣的模式。

先看一段代码:

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对象),虚函数调用导致的多态开销等等。




??
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Unity 查看所有GUI默认样式 下一篇HDU 5014 Number Sequence(贪心)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 C 语言或者限制使 (2025-12-25 08:50:05)
·C++构造shared_ptr为 (2025-12-25 08:50:01)
·既然引用计数在做 GC (2025-12-25 08:49:59)
·Java 编程和 c 语言 (2025-12-25 08:19:48)
·. net内存管理宝典这 (2025-12-25 08:19:46)