在设计实现中,很多地方都用到了Null Object设计模式
。Null Object模式
的含义在于,提供一个对象给指定的类型,用以代替这个对象为空的情况。 Null Object
提供了“什么也不做”的行为,隐藏来自它的合作者的细节。
对于如何理解和应用该模式,通过一个实例就能很好的进行说明。这一节我们在讨论消息分派器,消息分派器使用了前述的日志记录器,并且通过属性来注入具体的日志记录器对象。
private IEsfLogger esfLogger;
public IEsfLogger EsfLogger{
set{
this.esfLogger = value;
}
}
现在假设,我们在消息分派器内部的多个地方使用日志记录器来进行日志记录,我们总要写这样的语句:
if (this.esfLogger != null){
this.esfLogger.Log(); //记录日志
}
也就是说,在使用之前,我们都要判断一下日志记录器的引用是否为空,如果不为空才可以调用其Log方法。如果调用日志记录器进行日志记录的地方很多,那
么每个地方都会充斥着这种判断其引用是否为空的代码。有没有办法来避免这所有的判断语句了,有!那就是使用Null Object设计模式。
为每种必要的组件都提供了对应的Null Object
类型,这些类型的名字以“Empty”作为前缀。比如IEsfLogger对应的Null Object类型就是EmptyEsfLogger,EmptyEsfLogger实现的Log方法什么也不用做:
public void Log(string errorType ,string msg, string location, ErrorLevel level){
//Do Nothing !
}
有了EmptyEsfLogger,我们就可以象这样来设计消息分派器的日志记录器属性:
private IEsfLogger esfLogger = new EmptyEsfLogger();
public IEsfLogger EsfLogger{
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 CbSimple SomeOneConnected;
在类的构造函数中,可以使用Null Object来初始化它:
this.SomeOneConnected += delegate { };
这样,在每次触发事件时就不用再判断其是否为null了:
this.SomeOneConnected(); //不用再判断是否为null,直接触发事件
灵活地使用Null Object设计模式
,可以使得我们的代码更加简洁和精炼。
分享到:
相关推荐
为了解决这个问题,设计模式之一就是Null Object Pattern。这个模式的核心思想是在对象为null时提供一种默认行为,而不是抛出异常。 在C#中,我们可以创建一个“空对象”(Null Object)来模拟真实对象的行为,即使...
主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
在编程领域,设计模式是一种被广泛接受的解决常见问题的最佳实践。C#设计模式是.NET开发者在构建可扩展、可维护的软件系统时的重要工具。本文将深入探讨C#中的几种关键设计模式,并通过源码实例来加深理解。 1. **...
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...
23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...
单例设计模式是一种在软件设计中广泛使用的设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,或者对象的创建代价高昂时特别有用,例如数据库连接、线程池等。在C#中...
在许多面向对象的程序设计...NullObject模式能够用来解决这一问题。本文阐述了NullObject模式及其实现方式,针对空目标的单一实例化策略,给出了改进措施。NullObject模式对去除重复检测和减少空引用异常有较明显的效果。
在C#编程中,面向对象设计模式是一种组织代码和解决常见设计问题的模板。Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在需要控制资源的唯一...
### 设计模式——通俗易懂的解读 #### 引言 设计模式是在软件工程领域内广泛应用的一种编程思想,它能够帮助开发者解决常见的编程难题,并提供一套成熟、经过验证的解决方案。设计模式通常被分为三大类:创建型...
空对象模式(Null Object Pattern)是一种行为设计模式,它允许我们在不返回 null 的情况下提供默认行为。这种模式通常用于需要处理 null 对象的情况下,以避免NullPointerException 异常。 在软件设计中,我们经常...
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件中的内容,特别是“Singleton 单件(创建型模式).wmv”,显然是关于设计模式中的单例模式讲解,由微软金牌讲师用C#语言...
JavaScript设计模式是编程实践中一种优秀的代码组织方式,它总结了在特定场景下解决常见问题的最佳实践。构造函数模式是JavaScript中的一种重要设计模式,用于创建对象。本文将深入探讨构造函数模式及其应用。 构造...
设计模式是在软件工程中用于解决特定问题的一般性的可复用设计解决方案。在本文中,将详细探讨23种设计模式中的两种——单件模式(Singleton Pattern)和抽象工厂模式(Abstract Factory Pattern),并以C#语言为例...
数据访问对象(Data Access Object,简称DAO)设计模式是一种在软件工程特别是企业级应用开发中非常常见的设计模式。它的主要目的是分离业务逻辑与数据访问逻辑,使系统架构更为清晰,提高模块间的解耦度。这种模式...
设计模式是一种在软件开发中被广泛采用的最佳实践,它们提供了在特定场景下解决常见问题的模板。23种经典设计模式涵盖了创建型、结构型和行为型三大类别,旨在提高代码的可重用性、可读性和可维护性。本文将重点介绍...
《.NET架构师设计模式特训:深度剖析单例模式》 在软件开发中,设计模式是经过时间验证的、解决常见问题的有效方案。其中,单例模式是一种被广泛使用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。...
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
设计模式 - Singleton Pattern 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。这就是 Singleton Pattern 的设计动机。 Singleton ...