转自: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)

最新文章

  1. tab,tabCon里放很多div,点击左右滑动一个。可根据初始化清除空的tabCon。
  2. android xml特殊字符
  3. Swift&NodeJS 使用Alamofire进行Post(zhuan)
  4. startssl
  5. smartjs 0.2 OOP讲解 - factory
  6. PHP最原始的上传文件函数
  7. Codeforces Round #365 (Div. 2) C - Chris and Road 二分找切点
  8. Android 常规任务的高度【schedule】与【scheduleAtFixedRate】差额
  9. mysql中多个left join子查询写法以及别名用法
  10. Android滑动冲突解决
  11. ACM之路——上车了
  12. Django之ORM版学员管理系统
  13. 《算法》第四章部分程序 part 3
  14. PySide图形界面开发(一)
  15. 转:Ogre的MaterialSystem分析
  16. redis 数据备份持久化方案
  17. Redis之数据类型大全
  18. linux cp覆盖每次都有提示
  19. Markdown: Basics (快速入门)[转]
  20. javascript之分时函数

热门文章

  1. 【STL基础】list
  2. CSS(九)元素隐藏和利弊
  3. office word使用技巧汇总
  4. js 多张图片加载 环形进度条
  5. Flask&&人工智能AI -- 8 HTML5+ 初识,HBuilder,夜神模拟器,Webview
  6. 关于web安全需要在编程时注意的
  7. jQuery form插件的使用--ajaxForm()和ajaxSubmit()
  8. docker(3)docker下的centos7下安装jdk
  9. Yii2 前台控制器访问权限控制
  10. Java——socket