【设计模式 - 21】之空对象模式(Null Object)
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)的更多相关文章
- 设计模式のNullObjectPattern(空对象模式)----行为模式
一.产生背景 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查.Null 对象不是检查空值,而是反应一个不做任何动作的关系.这样的 Null 对象也可 ...
- 被遗忘的设计模式——空对象模式(Null Object Pattern)
GoF(四人帮)那本<设计模式 可复用面向对象软件的基础>可谓是设计模式方面的经典之作,其中介绍的23种设计模式, 也可谓是经典中的经典.但是,设计模式的种类绝不仅仅是这23种,除此之外还 ...
- 设计模式:空对象模式(Null Object Pattern)
设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...
- 空对象模式(Null Object Pattern)
空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...
- ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式
鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...
- C# 设计模式之空对象模式
最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...
- Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- Java设计模式之十三 ---- 观察者模式和空对象模式
前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...
- 设计模式之空对象模式(php实现)
github地址:https://github.com/ZQCard/design_pattern /** * 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象 ...
随机推荐
- hdu10007
题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半. 第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标.实数. 这个题目其实就是求最近点对的距离 #include< ...
- xcode 升级插件失效问题
摘要 Xcode 升级到7之后VVDocumenter-Xcode,OMColorSense,KSImageNamed等一系列的插件失效的解决办法,以及不小心误点了 Skipbundle 的解决办法 ...
- Solve Longest Path Problem in linear time
We know that the longest path problem for general case belongs to the NP-hard category, so there is ...
- Logstash同步Oracle数据到ElasticSearch
最近在项目上应用到了ElasticSearch和Logstash,在此主要记录了Logstash-input-jdbc同步Oracle数据库到ElasticSearch的主要步骤,本文是对环境进行简单 ...
- 检查并创建目录mkdir
os.listdir() os.path.isdir() os.path.join() os.mkdir() # -*- coding:utf-8 -*- import os,sys def mkdi ...
- Learning WCF Chapter2 WCF Contracts and Serialization
So far I’ve talked about the standards behind it all,but in fact WCF hides most of this from the dev ...
- Python 处理server返回gzip内容
Python 如何处理server返回gzip压缩过的内容,代码如下: from StringIO import StringIOimport gzip request = urllib2.Reque ...
- oracle时间模型
Oracle在9i或者早期的版本,对于性能优化方面,主要采用命中率模型,后面的版本,也保留着命中率模型,比如在awr报告中,Instance Efficiency Percentages (Targe ...
- .net 与 javascript脚本的几种交互方法
1.asp.net呼叫js Response.Write("<script language=javascript>"); Response.Write("a ...
- ORACLE解决登陆em状态暂挂方法
1.找到oracle安装目录中db_1/计算机名_orcl/sysman/config/emd.properties , 用记事本打开emd.properties,在emd.properties文件 ...