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 对象也可 ...
随机推荐
- 搭建免费wifi,嗅探接入该wifi的所有网络信息
环境: 1: create_ap , 搭建免费wifi. 2: wireshark , 嗅探网络信息. 搭建热点 搭建热点: git clone https://github.com/oblique/ ...
- JavaSE教程-04Java中循环语句for,while,do···while
** Java的循环语句 ** 引入: 生活中有循环,程序的世界也有循环. 思考:生活中有哪些循环的事情? 总结:什么是循环? 重复做类似的事情,而且有终止条件,如果没有终止条件会是怎样? 类似这样的 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- python基础操作_文件读写操作
#文件读写# r只能读不能写,且文件必须存在,w只能写不能读,a只能写不能读# w+是写读模式,清空原文件内容# r+是读写模式,没有清空原文件内容,# 只要有r,文件必须存在,只要有w,都会清空原文 ...
- 在ROS中使用花生壳的域名服务
ROS功能强大,也比较复杂,各个版本的脚本可能也大同小异,我现在使用的是6.37.3的版本. 添加Script 进入菜单System->Scripts. 点击加号,像图中这样,添加代码,我给这段 ...
- Spring学习(4)---Bean基础
Bean配置项 Bean的作用域 Bean的生命周期 Bean的自动装配 Resources & ResourceLoader (一) Bean配置项 常用的配置项 Id (IOC容器中B ...
- Android 创建虚拟机时“提示no system images installed for this target”
经上网查证,发现原因在于CPU/ABI选项无法选择,并显示“No system images installed for this target”,也就是没有适合的系统镜像,通过与安装好了的ADT-b ...
- python网络爬虫之初始网络爬虫
第一次接触到python是一个很偶然的因素,由于经常在网上看连载小说,很多小说都是上几百的连载.因此想到能不能自己做一个工具自动下载这些小说,然后copy到电脑或者手机上,这样在没有网络或者网络信号不 ...
- python 标准库 -- shutil
shutil shutil.move(src,dst) shutil.move('/tmp/20170223/new','/tmp/20170223/test') # 移动文件, 重命名等 shuti ...
- js对象中动态读取属性值 动态属性值 js正则表达式全局替换
$(document).ready(function(){ var exceptionMsg = '${exception.message }'; var exceptionstr = ''; //j ...