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

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

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

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

要返回的实体代码,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. RabbitMQ安装配置和基于EasyNetQ驱动的基础使用

    一.RabbitMQ基本概念和原理 1.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计. 2.Ra ...

  2. 一天搞定CSS:文本text--05

    1.文本体系 2.文本各属性取值 说明: 每一个属性后面的分支是属性值,以及对属性值的说明. 比如text-align- - - -有3个取值:left,center,right 3.空格大小 4.代 ...

  3. 9个常用iptables配置实例

    iptables命令可用于配置Linux的包过滤规则,常用于实现防火墙.NAT.咋一看iptables的配置很复杂,掌握规律后,其实用iptables完成指定任务并不难,下面我们通过具体实例,学习ip ...

  4. git与github的使用

    git和github是两个完全不同的概念,就好比如雷锋与雷峰塔的关系. git是一个版本管理工具,用来更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这个工具, 可以把你原来 ...

  5. HTTPS协议入门

    目录什么是https?https的利与弊?https的原理和流程?什么是证书/CA证书?什么是单向SSL认证与双向SSL认证?网站如何实现https?网站实现https的一些补充说明参考网页 一.什么 ...

  6. solr学习笔记-开篇

    由于工作需要,近期接触了一下全文检索的相关技术,从lucenen到solr开始慢慢一路摸爬滚打,仅以此文记录自己的学习里程和记录下各种坑. 本次学习基于以下环境版本: java7,solr5.5.4( ...

  7. Netty方法误解ChannelHandlerContext.writeAndFlush(Object msg)

    乍一看这个方法,以为什么消息都能输出,因为参数是Object类型的,但实际上,netty内部只支持两种类型,如图

  8. 利用php做出简单的发布信息和回复功能

    题目要求 1.建一个pinglun的数据库,自己建表2.完成一个简单的发布信息回复功能3.布局可以随便,主要是功能要实现4.注意回复是可以回复每一条的评论5.评论回复功能类似于qq空间的发布信息和回复 ...

  9. Bash扩展顺序

    当进行变量替换.命令替换.数学扩展以及路径扩展时,Bash Shell遵循如下顺序: 1.大括号扩展 $ls f{oo,aa,unble} 2.~扩展 ~cb, ~/doc/working 3.命令参 ...

  10. Javascript实现Base64解码

    工作中需要用到,在stackoverflow中找到的,实践证明可用. function decode_base64(s) { var e = {}, i, k, v = [], r = '', w = ...