设计模式之美:Null Object(空对象)
索引
意图
通过对缺失对象的封装,以提供默认无任何行为的对象替代品。
Encapsulate the absence of an object by providing a substitutable alternative that offers suitable default do nothing behavior.
In short, a design where "nothing will come of nothing".
结构

参与者
AbstractObject
- 声明协作对象的接口。
- 如果需要,可以实现默认行为。
RealObject
- 具体的协作对象类,提供有意义的行为。
NullObject
- 空对象类,继承自 AbstractObject,但接口实现不做任何事情。
Client
- 请求协作对象。
适用性
当以下情况成立时可以使用 Null Object 模式:
- 一个对象需要一个协作对象,但并无具体的协作对象。
- 协作对象不需要做任何事情。
效果
- 减少了对对象是否为 Null 的判断。
- 提供默认无任何具体行为的协作对象。
相关模式
- 因为 Null Object 通常没有任何状态,所以多个实例可能都是类似的,可以使用 Singleton 模式来实现。
- Null Object 看起来很像 Proxy 模式,但两者有着不同的目的。Proxy 提供对目标对象访问的控制,而 Null Object 并不隐藏任何对象。
- Null Object 可以作为 Strategy 模式中的一个特例。Strategy 提供多个具体类以区分算法,而 NullStrategy 则可不做任何事情。
- Null Object 可以作为 State 模式中的一个特例。使用 NullState 以便不做任何事情。
- 在 Visitor 模式中也可以使用 Null Object 以提供某种默认行为。
实现
实现方式(一):Null Object 的示例实现。
namespace NullObjectPattern.Implementation1
{
public interface ILog
{
void Write(string message);
} public class ConsoleLog : ILog
{
public void Write(string message)
{
Console.WriteLine(message);
}
} public class NullLog : ILog
{
public void Write(string message)
{
// do nothing
}
} public class Client
{
public void TestCase1()
{
ILog log1 = new ConsoleLog();
ILog log2 = new NullLog(); log1.Write("message to log");
log2.Write("message to log");
}
}
}
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Null Object(空对象)的更多相关文章
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- null、空对象和undefined
null:是对象,但是空引用(不指向任何对象) 空对象:是对象,但它的值是指向没有任何属性的对象的引用 undefined:未定义,所以不是对象,本身被定义为“undefined”这一特殊类型 1. ...
- Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- Java设计模式之十三 ---- 观察者模式和空对象模式
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- 设计模式:空对象模式(Null Object Pattern)
设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...
- 被遗忘的设计模式——空对象模式(Null Object Pattern)
GoF(四人帮)那本<设计模式 可复用面向对象软件的基础>可谓是设计模式方面的经典之作,其中介绍的23种设计模式, 也可谓是经典中的经典.但是,设计模式的种类绝不仅仅是这23种,除此之外还 ...
- Java 空对象设计模式(Null Object Pattern) 讲解
转自:http://www.cnblogs.com/haodawang/articles/5962531.html 有时候我们的代码中为避免 NullPointerException 会出现很多的对N ...
- 【设计模式 - 21】之空对象模式(Null Object)
1 模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...
- 设计模式之空对象(Null Object)模式
通过引用Null Object,用于取消业务逻辑中对对象的为空推断 类图: Nullable: package com.demo.user; public interface Nullable { b ...
随机推荐
- 关于移动端input框 在微信中 和ios中无法输入文字的问题
这个是一个提交的页面但是总是无法输入进去文字 在uc中是可以的 但是在微信中 或者ios自带浏览器是无法输入的 绞尽脑汁 找了半天 才发现自己多加了一段代码(这个代码是模版中自带的 我靠) ...
- Java中super的几种用法并与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...
- css中图片等比例缩放
li img{ display: inline-block; max-height: 60px; max-width: 60px; vertical-align: middle; }
- linux系统编程之错误处理
在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...
- UWP的拖拽功能
简单的拖拽实现: <Grid x:Name="G1" AllowDrop="True" DragEnter="G1_DragEnter" ...
- Python 第五天 模块(2)
模块,用一砣代码实现了某个功能的代码集合. 有两种存在的方式 1.写到一个文件夹里面 2.py文件 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和 ...
- UIAppearance
1> 只要遵守了UIAppearance协议,还要实现这个方法才能调用appearance相关方法 2> 只有被UI_APPEARANCE_SELECTOR宏修饰的属性,才能设置 // 获 ...
- Spring aop 原始的工作原理的理解
理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...
- 中国UTM分区
高斯-克吕格投影是“等角横切圆柱投影”,投影后中央经线保持长度不变,即比例系数为1: UTM投影是“等角横轴割圆柱投影”,圆柱割地球于南纬80度.北纬84度两条等高圈,投影后两条割线上没有变形,中央经 ...
- SVN修改用户名与密码
由于在svn的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想一些办法. 解决方案如下: 在Eclipse使用SVN的过程中大多数人往往习惯把访问SVN的用户名 ...