最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正。

今天先说说我个人觉得最简单的设计模式 -- [空对象模式]

空对象模式可以减少客户端对对象判断是否为空的重复操作,也可以减少异常发生的情况【如果客户端调用程序忘记了检查对象是否为空,而直接访问对象中的数据,则有可能会报出异常,影响程序运行】。

废话不说了,先上我写的代码,下面是未运用空对象模式之前的示例代码:

要返回的实体代码,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# 设计模式之空对象模式的更多相关文章

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

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

  2. GoLang设计模式12 - 空对象模式

    空对象设计模式是一种行为型设计模式,主要用于应对空对象的检查.使用这种设计模式可以避免对空对象进行检查.也就是说,在这种模式下,使用空对象不会造成异常. 空对象模式的组件包括: Entity:接口,定 ...

  3. 设计模式之空对象模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象 ...

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

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

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

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

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

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

  7. ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式

    鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...

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

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

  9. 设计模式のNullObjectPattern(空对象模式)----行为模式

    一.产生背景 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查.Null 对象不是检查空值,而是反应一个不做任何动作的关系.这样的 Null 对象也可 ...

随机推荐

  1. java中的中文参数存到数据库乱码问题

    关于java中的中文参数乱码问题,遇见过很多,若开发工具的字符集环境和数据库的字符集环境都一样,存到数据库中还是乱码的话,可以通过以下方法解决: 用数据库客户端检查每个字段的字符集和字符集校对和这个表 ...

  2. MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

    本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...

  3. socket套接字编程

    一.概述 1.socket是一种进程间通信方式,既可以用于一台机器,也可以用于网络.常用语C/S模型. 2.可以跨越Windows和Linux操作系统,可以跨越不同语言. 3.注意网络字节序和主机字节 ...

  4. 表连接查询的顺序和where子句条件的前后顺序会影响sql的性能么

    有好多时候,我们常听别人说大表在前,小表在后,包括现在好多百度出来的靠前的答案都有说数据库是从右到左加载的,所以from语句最后关联的那张表会先被处理.如果三表交叉,就选择交叉表来作为基础表.等等一些 ...

  5. Java 中Calendar、Date、SimpleDateFormat学习总结

    在之前的项目中,经常会遇到Calendar,Date的一些操作时间的类,并且总会遇到时间日期之间的格式转化问题,虽然做完了但是总是忘记,记不清楚,每次还都要查找资料.今天总结一下,加深印象. Cale ...

  6. CSS实现矩形按钮右边缘的中间有个往里凹的小半圆

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  8. python 标准库 -- configparser

    configparser 用于处理 ini 格式的配置文件, 其本质上是利用 open 来操作文件. 示例文件 : [zhangsan] name = zhangsan age = 12 job = ...

  9. SICIP-1.3-Defining a new function

    定义函数 def <name> (former parament): 函数体(缩进) 环境 全局环境 局部环境 只在函数内部有效 TIP 函数体只在调用的最后执行 抽象化函数 函数域(函数 ...

  10. VR虚拟现实技术在教育领域的前景展望

    VR虚拟现实技术在教育领域的前景展望 VR虚拟现实技术能迅速火起来,是基于它突破了人们对三维空间在时间与地域上的感知限制,以及市场需求愿景的升级.此技术可广泛地应用到城市规划.室内设计.工业仿真.古迹 ...