Object Null 设计模式

本文介绍如何在代码中运用ObjectNull设计模式,通过引入NullObject类型来避免频繁检查对象是否为空,从而提高代码的简洁性和效率。以消息分派器为例,展示了如何在不涉及事件触发的情况下简化日志记录器的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object Null 设计模式:在频繁需要判断某个对象是否为空的时候,可以用。

使用Object Null 设计模式有利于管理,初始赋值的问题。

具体实现:可以专门设计一个单例类,专门来为对象赋初值。

下面转载一篇网上阐述的Object Null模式的文章:

ESFramework的设计实现中,很多地方都用到了Null Object设计模式。Null Object模式的含义在于,提供一个对象给指定的类型,用以代替这个对象为空的情况。 Null Object提供了“什么也不做”的行为,隐藏来自它的合作者的细节。
对于如何理解和应用该模式,通过一个实例就能很好的进行说明。这一节我们在讨论消息分派器,消息分派器使用了前述的日志记录器,并且通过属性来注入具体的日志记录器对象。

private IEsfLoggeresfLogger;
public IEsfLoggerEsfLogger
{
set
{
this .esfLogger = value;
}
}

现在假设,我们在消息分派器内部的多个地方使用日志记录器来进行日志记录,我们总要写这样的语句:

if ( this .esfLogger != null )
{
this .esfLogger.Log(); // 记录日志
}

也就是说,在使用之前,我们都要判断一下日志记录器的引用是否为空,如果不为空才可以调用其Log方法。如果调用日志记录器进行日志记录的地方很多,那么每个地方都会充斥着这种判断其引用是否为空的代码。有没有办法来避免这所有的判断语句了,有!那就是使用Null Object设计模式。
ESFramework为每种必要的组件都提供了对应的Null Object类型,这些类型的名字以“Empty”作为前缀。比如IEsfLogger对应的Null Object类型就是EmptyEsfLogger,EmptyEsfLogger实现的Log方法什么也不用做:

public void Log( string errorType, string msg, string location,ErrorLevellevel)
{
// DoNothing!
}

有了EmptyEsfLogger,我们就可以象这样来设计消息分派器的日志记录器属性:

private IEsfLoggeresfLogger = new EmptyEsfLogger();
public IEsfLoggerEsfLogger
{
set
{
if (value != null )
{
this .esfLogger = value ?? new EmptyEsfLogger();
}
}
}

首先,将esfLogger字段的默认值设为一个Null Object。其次,当调用者每次试图将EsfLogger属性设置为null时,也将一个Null Object赋值给该字段。
如此一来,在消息分配器内部,我们就可以非常方便的直接使用日志记录器,而不用再判断其引用是否为空,因为无论如何,它总是指向一个有效的对象,即使这个对象是Null Object。

除了常见的组件装配可以使用Null Object模式外,还有一个非常适合使用Null Object模式的场合,那就是“事件”。你是否还记得,我们每次触发事件时都需要判断其是否为空,这也是非常琐碎的事情,我们仍然可以通过Null Object模式来简化它。比如某个类中定义了一个事件:

public event CbSimpleSomeOneConnected;

在类的构造函数中,可以使用Null Object来初始化它:

this .SomeOneConnected += delegate {};

这样,在每次触发事件时就不用再判断其是否为null了:


注:本文节选自我的书稿 《.NET通信框架的设计、实现与应用》

this .SomeOneConnected(); // 不用再判断是否为null,直接触发事件

灵活地使用Null Object设计模式,可以使得我们的代码更加简洁和精炼。

转至:http://www.cnblogs.com/zhuweisky/archive/2007/02/28/660075.html

下面还有个讨论Object Null设计模式的帖子,讨论的很透彻,不太理解Object Null设计模式的,可以参考,看完后我相信你能理解它的用处的和什么时候采用,呵呵!

http://www.javaeye.com/topic/272872

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值