设计模式:空对象模式(Null Object Pattern)

背景

群里聊到《ASP.NET设计模式》,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式,在此记录一下大概的结论。

典型结构

模式的结构非常简单,这里就不多说了,类图如下:

为什么使用这个模式?还需要null吗?

之所以需要这个模式是因为这个模式可以消除重复。想象一下,假如有多个消费端,每个消费端都要判断一下是否为空,而且对于为空的场景要做特殊的处理,这样就会导致很多重复。一些例子是:日志对象和缓存对象。

这个模式带来的另外一个好处就是方便做测试,这些Null Object类似Stub Object。

引入这个模式的前提是:“所有消费端对于空对象的行为的期望是一致的”,如果消费端A和消费端B对于“空”的处理方式不一样,就需要两个Null Object。对于大多数对象,他们不清楚为“空”时消费端到底需要啥行为,因此null还是需要的,而且大多数场景还是需要null。

有些语言有nil对象,这种对象可以接受任何消息,这些消息不会出现异常,也没有返回结果,对于这种语言结构,编程时需要非常注意,很可能引入BUG,并不是说这种结构不好,我是非常喜欢的。

null object可以结合嵌套私有类,见下例:

 1         /// <summary>
2 /// 返回后续处理器。
3 /// </summary>
4 public static IDeserializePostProcesser GetProcesser(Type resultType)
5 {
6 resultType.MustNotNull("resultType");
7
8 if (_Processers.ContainsKey(resultType))
9 {
10 return _Processers[resultType];
11 }
12
13 return new EmptyDeserializePostProcesser();
14 }
15
16 private class EmptyDeserializePostProcesser : IDeserializePostProcesser
17 {
18 public object OnDeserialized(object result)
19 {
20 return result;
21 }
22 }

备注

社区和QQ是个好东西,这里有很多支持你的朋友,他们给你鼓励、意见和批评。谢谢兄弟们,加油!

设计模式:空对象模式(Null Object Pattern)的更多相关文章

  1. 被遗忘的设计模式——空对象模式(Null Object Pattern)

    GoF(四人帮)那本<设计模式 可复用面向对象软件的基础>可谓是设计模式方面的经典之作,其中介绍的23种设计模式, 也可谓是经典中的经典.但是,设计模式的种类绝不仅仅是这23种,除此之外还 ...

  2. 用最简单的例子理解对象为Null模式(Null Object Pattern)

    所谓的"对象为Null模式",就是要求开发者考虑对象为Null的情况,并设计出在这种情况下的应对方法. 拿"用最简单的例子理解策略模式(Strategy Pattern) ...

  3. Java 空对象设计模式(Null Object Pattern) 讲解

    转自:http://www.cnblogs.com/haodawang/articles/5962531.html 有时候我们的代码中为避免 NullPointerException 会出现很多的对N ...

  4. Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式

    前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...

  5. Java设计模式之十三 ---- 观察者模式和空对象模式

    前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...

  6. C# 设计模式之空对象模式

    最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...

  7. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  8. 【设计模式 - 21】之空对象模式(Null Object)

    1      模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...

  9. 设计模式之美:Null Object(空对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Null Object 的示例实现. 意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品. Encapsulate t ...

随机推荐

  1. std::move()

    #include <iostream> #include <utility> #include <vector> #include <string> i ...

  2. AngularJS应用开发思维之3:依赖注入

    找不到的API? AngularJS提供了一些功能的封装,但是当你试图通过全局对象angular去 访问这些功能时,却发现与以往遇到的库大不相同. $http 比如,在jQuery中,我们知道它的AP ...

  3. 在Mac OS X 10.8中配置Apache+PHP+MySQL

    在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...

  4. js 正则之 控制字符 \cX

    原文:js 正则之 控制字符 \cX 前些天在司徒正美的群里有人问了这么个问题:正则表达式里特殊字符 \cX 到底是什么?确实,我之前也挺在意的,但是一直没去看到底是什么.在MDN上只说是控制字符(详 ...

  5. ubuntu下Eclipse无法启动

    我的Ubuntu是12.04 LTS版的.jdk是官网下载后解压就可以用的.配置好PATH和CLASSPATH后,双击Eclipse弹出这个窗口: 但是如果通过终端,以命令行的方式执行 ./eclip ...

  6. leetcode第15题--3Sum

    Problem: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Fi ...

  7. 在Win7中安装程序集到GAC

    原文:在Win7中安装程序集到GAC 微软为提高系统安全,自Vista推出后,在Windows系统中加入了一个新的东东——UAC(User Account Control),这样一个新的技术使得许多操 ...

  8. ASP.NET MVC项目

    ASP.NET MVC项目里创建一个aspx视图 先从控制器里添加视图 视图引擎选"ASPX(C#)",使用布局或模板页不要选. 在Views\EAV目录里,生成的aspx是个单独 ...

  9. 学习selenium python版最初的一个小想法

    这个还是我在刚开始学习selenium的时候做的,自己觉得有点意思,在接下来我会基于目前我对于selenium的一些深入研究,写下我对selenium的理解以及UIAutomation的一些理解,以此 ...

  10. leetcode Binary Tree Postorder Traversal 二叉树后续遍历

    先给出递归版本的实现方法,有时间再弄个循环版的.代码如下: /** * Definition for binary tree * struct TreeNode { * int val; * Tree ...