转自:http://www.cnblogs.com/haodawang/articles/5962531.html

有时候我们的代码中为避免 NullPointerException 会出现很多的对Null的判断语句,而这些语句一旦多起来,我们的代码就会变的惨不忍睹,因此我们引入了空对象模式(null object pattern)以此来使我们的代码变的更优雅一点。

下面来看一下空对象模式的大概视图

为了方便我这里就直接用手写的了,大家谅解一下:) ,凑合着看吧

假如我们需要查询某个学生的信息,我们输入学号来进行查询,如果没有这个学生的话,我们就返回一个空对象,以此来实现空对象模式。

下面是我的代码实现。

import java.util.Scanner;

//首先我定义一个为查询和空对象的类定义一个共同的接口
interface AbstractCustomer{
String query();
} //查询学号的具体实现
class RealObject implements AbstractCustomer{
@Override
public String query() {
//这里你也可以返回一些别的有用的东西,我这里为了演示就返回一个字符串
return "successful";
}
} //空对象类的实现
class NullObject implements AbstractCustomer{
@Override
public String query() {
return "can not find this student";
}
} //建造工厂
class CustomerFactory{
//我们假定这是我们储存学生学号的数据库,现在我们获取到了,把它装到我们的数组里
int[] arr = {1,2,3,4,5}; public AbstractCustomer query(){
//模拟查询学号
Scanner scanner = new Scanner(System.in);
System.out.println("please input student_id:\n");
int index = scanner.nextInt();
for(int i : arr){
if(i == index){
return new RealObject();
}
}
//如果没有查找到的话我们直接返回一个空对象
return new NullObject();
}
} //接下来是客户端方面,我们直接操作工厂即可
public class Main {
static void customer(CustomerFactory cf){
//先调用工厂的query返回一个对象,然后再用这个对象调用自己的query
String s = cf.query().query();
System.out.println(s);
}
public static void main(String[] args){
customer(new CustomerFactory());
}
}

上面则是描述的空对象模式,当我们需要较多的判断是否为null时,可以用到这个模式,以上代码还可以给接口再添加一个isNull方法来确切的判断是否为Null。

我们来执行一下这个程序

接下来我们输入一个数组里没有的数据

以上就是空对象模式的讲解,如果大家有任何疑问可以在回复区给我回复,谢谢:)

更深入的了解空对象设计模式阅读:被遗忘的设计模式——空对象模式(Null Object Pattern)

Java 空对象设计模式(Null Object Pattern) 讲解的更多相关文章

  1. Java空对象设计模式

    有时候我们的代码中为避免 NullPointerException 会出现很多的对Null的判断语句,而这些语句一旦多起来,我们的代码就会变的惨不忍睹,因此我们引入了空对象模式(null object ...

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

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

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

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

  4. Java进阶(二十一)java 空字符串与null区别

    java 空字符串与null区别 1.类型 null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ; ""表示的是一个空字符串, ...

  5. Java空字符串与null的区别和判断字符串是否为空的方法

    Java空字符串与null的区别: 1.类型null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ;""表示的是一个空字符串,也 ...

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

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

  7. 用最简单的例子理解对象为Null模式(Null Object Pattern)

    所谓的"对象为Null模式",就是要求开发者考虑对象为Null的情况,并设计出在这种情况下的应对方法. 拿"用最简单的例子理解策略模式(Strategy Pattern) ...

  8. Java空对象模式

    在“空对象”模式中,空对象将替换NULL对象实例的检查.而不是检查一个空值,Null对象反映一个无关的关系(即什么也不做). 这种Null对象还可以用于在数据不可用时提供默认行为. 在空对象模式(Nu ...

  9. 【java】对象克隆protected Object clone() throws CloneNotSupportedException

    package 对象克隆; class A implements Cloneable{//要具备clone()功能必须要实现Cloneable接口,此接口里无方法,只起标识作用. private St ...

随机推荐

  1. kuangbin专题十二 POJ1661 Help Jimmy (dp)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14214   Accepted: 4729 Descr ...

  2. kuangbin专题十二 HDU1176 免费馅饼 (dp)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. [WebShow系列] 评委打分端现场操作方法

    前期准备: 在活动现场,组委会为每一个评委准备了打分相关东西: A.一个移动打分设备(平板电脑,或评委自己手机,或电脑也行); B.(可选)纸质的打分清单和笔.此清单中有打分细则,上场选手清单及打分处 ...

  4. springboot整合fastdfs

    首先pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  5. 封装下Excel导出

    1. 使用方法 1.1 对象使用注解 @ExcelColumn(name = "页面1",freeze = "0,1,1,2",autoWidth=true) ...

  6. MySql8最新配置方式(完美)

    下载MYSQL8 地址:https://www.mysql.com/downloads/ 1.滑动网页到最下面,选择Community (GPL) Downloads » 2.选择MySQL Comm ...

  7. POJ3074 Sudoku 剪枝深(神?)搜

    emm...挺秀的...挺神的? 每行,每列,每宫用一个二进制数表示选或没选的状态,刚开始设没选为1,然后更改状态的时候异或一下就好了: 这样可以通过lowbit取出每一个没有选过的数:(妙啊? 关于 ...

  8. BZOJ 3083 遥远的国度 树链剖分+脑子

    唉..又调了半天QWQ..为何读入挂了.....莫非读入是反着的????据ywy学长所言如是...OvO震惊 这啥骚题啊...还要换根...不过清明讲过...(然鹅我现在才做... 先随便选个点(比如 ...

  9. TXT文件导入到ORACLE数据库中

    --创建表 (sqlplus执行) drop table cjw; ),phone ),city ),born ),adressJob ),mail )); ### txt导入到oracle cat ...

  10. 10-----BBS论坛

    BBS论坛(十) 10.1.客户端权限验证功能完成 (1)cms/cms_profile 显示当前用户的角色和权限 <tr> <td>角色:</td> <td ...