C# 设计模式之空对象模式
最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正。
今天先说说我个人觉得最简单的设计模式 -- [空对象模式]
空对象模式可以减少客户端对对象判断是否为空的重复操作,也可以减少异常发生的情况【如果客户端调用程序忘记了检查对象是否为空,而直接访问对象中的数据,则有可能会报出异常,影响程序运行】。
废话不说了,先上我写的代码,下面是未运用空对象模式之前的示例代码:
要返回的实体代码,Person.cs:
namespace NullObjectPattern
{
public class Person
{
/// <summary>
/// 用户ID
/// </summary>
public int Id { set; get; } /// <summary>
/// 用户名字
/// </summary>
public string Name { set; get; } /// <summary>
/// 学习
/// </summary>
public void Study()
{
Console.WriteLine("{0}学习中……",Name);
} }
}
中间访问层代码,PersonService.cs:
namespace NullObjectPattern
{
public class PersonService
{
/// <summary>
/// 获取用户信息方法
/// </summary>
/// <param name="id">用户id</param>
/// <returns>用户信息对象实体</returns>
public Person GetPersonById(int id)
{
Person p = null;
if (id == )
{
p = new Person
{
Id = ,
Name = "小明"
};
}
return p;
} }
}
程序主入口代码,Program.cs:
using System; namespace NullObjectPattern
{
class Program
{
static void Main(string[] args)
{
var service = new PersonService();
var person = service.GetPersonById(2);
Console.Write("用户的名字为:{0}",person.Name);
Console.Read();
}
}
}
输出的结果:

主程序入口代码改造后,Program.cs:
using System; namespace NullObjectPattern
{
class Program
{
static void Main(string[] args)
{
{
var service = new PersonService();
var person = service.GetPersonById();
if (person == null)
Console.WriteLine("用户的名字为:未知");
else
Console.WriteLine("用户的名字为:{0}", person.Name);
if (person != null)
{
person.Study();
} Console.Read();
}
}
}
输出的结果:

按照上面的代码来写的话,我每次获取用户的详细信息是不是都需要判断用户的对象是否为空?这样会不会有重复的代码?影响代码质量?
我们的空对象模式就解决了这个问题。
增加一个抽象类,Human.cs:
public abstract class Human
{
/// <summary>
/// 用户ID
/// </summary>
public int Id { set; get; } /// <summary>
/// 用户名字
/// </summary>
public string Name { set; get; } /// <summary>
/// 学习
/// </summary>
public abstract void Study(); }
然后让真正的实体类和空对象类同时继承这个抽象类:
public class Person: Human
{
/// <summary>
/// 实现方法的默认实现
/// </summary>
public override void Study()
{
Console.WriteLine("{0}学习中……",Name);
}
}
空对象类:
public class NullPerson : Human
{ public NullPerson()
{
Id = ;
Name = "未知";
} /// <summary>
/// 实现方法的默认实现
/// </summary>
public override void Study()
{
Console.WriteLine("无法学习");
}
}
中间访问层,PersonService.cs:
namespace NullObjectPattern
{
public class PersonService
{
/// <summary>
/// 获取用户信息方法
/// </summary>
/// <param name="id">用户id</param>
/// <returns>用户信息对象实体</returns>
public Human GetPersonById(int id)
{
Human human = null;
if (id == )
{
human = new Person
{
Id = ,
Name = "小明"
};
}
else
{
human = new NullPerson();
}
return human;
}
}
}
主程序代码:
class Program
{
static void Main(string[] args)
{
{
Console.WriteLine("空对象模式******************************");
var service = new PersonService();
var person = service.GetPersonById();
Console.WriteLine("用户的名字为:{0}", person.Name);
person.Study();
}
Console.Read();
}
}
输出的结果:

总结:
综上所述,空对象模式能减少客户端的工作量,把判断返回对象是否为空的逻辑交给了中间层,也减少客户端发生异常的可能性,对程序的性能进行了优化。
缺点:就是每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加实体层的文件数量。个人觉得这种模式在工程或者实体文件很少的情况下可以适当使用,不建议在实际工作开发中大量的使用。
谨慎使用即可。
C# 设计模式之空对象模式的更多相关文章
- 设计模式:空对象模式(Null Object Pattern)
设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...
- GoLang设计模式12 - 空对象模式
空对象设计模式是一种行为型设计模式,主要用于应对空对象的检查.使用这种设计模式可以避免对空对象进行检查.也就是说,在这种模式下,使用空对象不会造成异常. 空对象模式的组件包括: Entity:接口,定 ...
- 设计模式之空对象模式(php实现)
github地址:https://github.com/ZQCard/design_pattern /** * 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象 ...
- Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- Java设计模式之十三 ---- 观察者模式和空对象模式
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- 被遗忘的设计模式——空对象模式(Null Object Pattern)
GoF(四人帮)那本<设计模式 可复用面向对象软件的基础>可谓是设计模式方面的经典之作,其中介绍的23种设计模式, 也可谓是经典中的经典.但是,设计模式的种类绝不仅仅是这23种,除此之外还 ...
- ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式
鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...
- 【设计模式 - 21】之空对象模式(Null Object)
1 模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...
- 设计模式のNullObjectPattern(空对象模式)----行为模式
一.产生背景 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查.Null 对象不是检查空值,而是反应一个不做任何动作的关系.这样的 Null 对象也可 ...
随机推荐
- 纯CSS3向右循环闪过效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- (原创)Maven+Spring+CXF+Tomcat7 简单例子实现webservice
这个例子需要建三个Maven项目,其中一个为父项目,另外两个为子项目 首先,建立父项目testParent,选择quickstart: 输入项目名称和模块名称,然后创建: 然后建立子项目testInt ...
- JVM点滴
JVM java拥有GC,为什么还会内存泄漏? 理解什么是内存泄漏: Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露. Java为了简化编程工作,对于不再 ...
- Java之进程与线程练习
1.设计一个线程类:创建3个子线程,每个线程分别打印数字,分别睡眠100,200,300ms ->每个执行都是20次 代码: package Homework; //1.设计一个线程类:创建3个 ...
- weex入门
近期要做一个安卓端的原生应用程序.情况是这样的:需求方原先已经实现了网页,是一个工具类应用,大致作用是连接到他们公司生产的硬件,然后通手机与智能硬件通信来对硬件进行一系列控制.不过呢,这个网页先前是由 ...
- 《孵化twitter》读书笔记
寒假在家看完了第一本书——<孵化twitter:从蛮荒到IPO的狂野旅程>.在2014上半年,尝试看了该书的英文原版,奈何自己英语太菜,实在看不懂.这次有了中文版,就决定要看看.该书对于我 ...
- 【转载】图文详解 IntelliJ IDEA 15 创建普通 Java Web 项目
第 1 部分:新建一个 Java Web Application 项目 File -> New -> Project-,请选择 Java EE 这个模块下的 Web Application ...
- 使用Azure Policy(策略)强制实现资源Tag的坑
Azure的Tag(标记)可以帮助运维人员对云资源分类从而方便地进行计费和资源管理.然而在具体实践中工程师部署云资源的时候常常会忘记给资源做标记打Tag. 针对这个问题,Azure的官方文档建议是可以 ...
- RSA加密通信小结(四)--RSA加解密的实际操作与流程小结
在上一篇文章中,我们已经将密钥的生成方法和流程,归纳总结.而本篇主要是讲如何利用密钥进行加解密. 首先,在上一篇文章中的我们生成了很多密钥,证书等等. 在上述生成的文件中,接收服务端加密报文:pkcs ...
- SICP-1.4-函数设计
何为好的函数 每个函数只完成一个工作 不要做重复工作 如果你多次复制一段代码块,说明你应该进行函数抽象了 定义一般化函数 避免特例化 函数说明 一般通过三引号说明 help调出函数说明 避免过多的参数 ...