1、模式简介

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

  在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。

  空对象模式一般和策略模式或工厂模式结合使用。

2、案例

  在这个例子中,我们使用工厂,根据姓名初始化用户,如果姓名在要求范围内,则生成一个用户,否则生成一个空对象的用户。具体代码如下:

  用户抽象父类User中的代码:

public abstract class User {
protected String name; public User(String name) {
this.name = name;
} public abstract void introduce();
}

  真实用户类RealUser中的代码:

public class RealUser extends User {

    public RealUser(String name) {
super(name);
} @Override
public void introduce() {
System.out.println("My Name Is " + super.name);
}
}

  空用户类NullUser中的代码:

public class NullUser extends User {

    public NullUser(String name) {
super(name);
} @Override
public void introduce() {
System.out.println("I am a NULL Object!!!!");
}
}

  用户工厂类UserFactory中的代码如下:

public class UserFactory {
private static final String[] NAME_LIMIT = { "Jack", "Rose", "Tom" }; private static UserFactory instance; private UserFactory() {
} public static UserFactory getInstance() {
if (instance == null) {
synchronized (UserFactory.class) {
if (instance == null) {
instance = new UserFactory();
}
}
}
return instance;
} public User getUserByName(String name) {
User user = new NullUser(name);
for (String n : NAME_LIMIT) {
if (n.equals(name)) {
user = new RealUser(name);
}
}
return user;
}
}

  测试类Test中的代码:

public class Test {
public static void main(String[] args) {
User user1 = UserFactory.getInstance().getUserByName("Jack");
user1.introduce(); User user2 = UserFactory.getInstance().getUserByName("Rose");
user2.introduce(); User user3 = UserFactory.getInstance().getUserByName("Tom");
user3.introduce(); User user4 = UserFactory.getInstance().getUserByName("Jerry");
user4.introduce();
}
}

  运行结果如下图所示:

  下面贴出空对象模式代码的GitHub地址:【GitHub - Null Object】

【设计模式 - 21】之空对象模式(Null Object)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python调用Moxa PCOMM Lite通过串口Ymodem协议发送文件

    本文采用python 2.7编写. 经过长期搜寻,终于找到了Moxa PCOMM Lite.调用PCOMM.DLL可以非常方便的通过串口的Xmodem.Ymodem.Zmodem等协议传输文件,而无需 ...

  2. C语言-06复杂数据类型-01数组

    01-数组 #include <stdio.h> int main() { // 使用注意 // 都是正确写法 //int ages[5] = {10 , 11, 12, 67, 56}; ...

  3. ajax error函数

    老是去百度 还是自己记下来吧 $.ajax({ url: '/AJAX请求的URL', success: function (data) { alert(data); }, error: functi ...

  4. BZOJ1861[ZJOI2006]Book书架

    Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...

  5. 8月1日起,这些新政将影响移动互联网产业-b

    今天,国家互联网信息办公室发布<移动互联网应用程序信息服务管理规定>.这项规定将从8月1日起生效,其中侧重对两类玩家提出了监管意见,他们分别是: 移动互联网应用程序提供者,即提供信息服务的 ...

  6. 有很多功能交给IIS实现就好了啊,之前干嘛要自己写?

    比方说设置默认主页啊,错误页伪静态之类的

  7. 根据WSDL生成代理类方式

    方式一: 1.使用VS2010提供的工具wsdl.exe由WSDL文件生成cs文件 使用wsdl.exe的/serverInterface选项(或缩写的 /si)指定输入的wsdl文件(注意,如果要转 ...

  8. Android ContentProvider和getContentResolver

    安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器. 关于SqlLite数据库的文章 ...

  9. Android 颜色Color

    Android中使用4个数字来表示颜色,分别是alpha.红(red).绿(green).蓝(blue)四个颜色值(ARGB).每个数字取值0-255,因此一个颜色可以用一个整数来表示.为了运行效率, ...

  10. 求奇数偶数的和,,利用while循环

    static void Main(string[] args)        {             while (true)                {             try   ...