java设计模式之空对象模式
来源:互联网 发布:淘宝怎么看访客 编辑:程序博客网 时间:2024/05/09 18:56
一、空对象模式简介
在空对象模式中,一个空对象取代NULL对象的实例的检查。NULL对象不是检查空值,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
空对象模式一般和策略模式或工厂模式结合使用。
二、示例演示
1、业务需求
假设这样一个场景:
在一个图书信息查询系统中,你调用一个方法,传过去你要查找图书的ID,然后它返回给你,你要查找的图书对象,这样你就可以调用对象的方法来输出图书的信息。
下面,我们来实现以下具体的代码。
2、不使用空对象设计模式
首先,我们来看一下ConcreteBook类的代码(提供构造函数和展示图书信息的show()方法。)
再来看看创建图书对象的图书工厂的代码(主要提供一个获得ConcreteBook的方法):
最后,来看一下客户端的代码:
1**设计模式**GoF
如果我们把ConcreteBook book = bookFactory.getBook(1);中的1改为-1则会出现空指针异常,因为我们通过bookFactory.getBook()方法获取ConcreteBook对象的时候,如果我们传入的参数,即图书的ID,属于非法值(如-1)或者不存在(如3)的话(其实这种情况是经常遇到的。),就会返回null,表示我们查找的图书信息并不存在。这时,book为null.你再调用book.show()。当然要报空指针的错误了。那怎么解决呢?我们可以使用空对象模式来解决这个问题。
定义工厂类(返回对象从ConcreteBook改为Book,并当ID属于非法值或者不存在时,返回NullBook对象。)
测试代码
这样即使输入的参数不合法,不会出现程序异常,但会提醒用户输入参数不合法。
三、总结
空对象模式的优点
1、它可以加强系统的稳固性,能有有效地防止空指针报错对整个系统的影响,使系统更加稳定。
2、它能够实现对空对象情况的定制化的控制,能够掌握处理空对象的主动权。
3、它并不依靠Client来保证整个系统的稳定运行。
4、它通过isNull对==null的替换,显得更加优雅,更加易懂。
在空对象模式中,一个空对象取代NULL对象的实例的检查。NULL对象不是检查空值,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
空对象模式一般和策略模式或工厂模式结合使用。
二、示例演示
1、业务需求
假设这样一个场景:
在一个图书信息查询系统中,你调用一个方法,传过去你要查找图书的ID,然后它返回给你,你要查找的图书对象,这样你就可以调用对象的方法来输出图书的信息。
下面,我们来实现以下具体的代码。
2、不使用空对象设计模式
首先,我们来看一下ConcreteBook类的代码(提供构造函数和展示图书信息的show()方法。)
public class ConcreteBook { private int ID; private String name; private String author; // 构造函数 public ConcreteBook(int ID, String name, String author) { this.ID = ID; this.name = name; this.author = author; } //显示图示信息 public void show() { System.out.println(ID + "**" + name + "**" + author); } }
再来看看创建图书对象的图书工厂的代码(主要提供一个获得ConcreteBook的方法):
public class BookFactory { public ConcreteBook getBook(int ID) { ConcreteBook book = null; switch (ID) { case 1: book = new ConcreteBook(ID, "设计模式", "GoF"); break; case 2: book = new ConcreteBook(ID, "我的设计模式", "空对象模式"); break; default: book = null;// 其实这个可以省略,因为初始化已经赋值为null。 break; } return book; }}
最后,来看一下客户端的代码:
public class Client { static void main(String[] args) { BookFactory bookFactory = new BookFactory(); ConcreteBook book = bookFactory.getBook(1); book.show(); } }运行结果:
1**设计模式**GoF
如果我们把ConcreteBook book = bookFactory.getBook(1);中的1改为-1则会出现空指针异常,因为我们通过bookFactory.getBook()方法获取ConcreteBook对象的时候,如果我们传入的参数,即图书的ID,属于非法值(如-1)或者不存在(如3)的话(其实这种情况是经常遇到的。),就会返回null,表示我们查找的图书信息并不存在。这时,book为null.你再调用book.show()。当然要报空指针的错误了。那怎么解决呢?我们可以使用空对象模式来解决这个问题。
3、使用空对象模式
首先定义一个抽象接口Book类public interface Book { // 判断Book对象是否为空对象(Null Object) public boolean isNull(); // 展示Book对象的信息内容。 public void show();}然后新增一个空对象类NullBook类和一个非空对象类ConcreteBook类
public class NullBook implements Book { public boolean isNull() { return true; } public void show() { System.out.println("Sorry,未找到符合您输入的ID的图书信息,请确认您输入的不是非法值。"); }}
public class ConcreteBook implements Book{ private int ID; private String name; private String author; // 构造函数 public ConcreteBook(int ID, String name, String author) { this.ID = ID; this.name = name; this.author = author; } public void show() { System.out.println(ID + "**" + name + "**" + author); } public boolean isNull(){ return false; }}
定义工厂类(返回对象从ConcreteBook改为Book,并当ID属于非法值或者不存在时,返回NullBook对象。)
public class BookFactory { public Book getBook(int ID) { Book book;//将原来的ConcreteBook改为Book switch (ID) { case 1: book = new ConcreteBook(ID, "设计模式", "GoF"); break; case 2: book = new ConcreteBook(ID, "我的设计模式", "空对象模式"); break; default: book = new NullBook();//创建一个NullBook对象 break; } return book; }}
测试代码
public static void main(String[] args) { BookFactory bookFactory = new BookFactory(); Book book = bookFactory.getBook(-1); book.show();}
这样即使输入的参数不合法,不会出现程序异常,但会提醒用户输入参数不合法。
三、总结
空对象模式的优点
1、它可以加强系统的稳固性,能有有效地防止空指针报错对整个系统的影响,使系统更加稳定。
2、它能够实现对空对象情况的定制化的控制,能够掌握处理空对象的主动权。
3、它并不依靠Client来保证整个系统的稳定运行。
4、它通过isNull对==null的替换,显得更加优雅,更加易懂。
0 0
- java设计模式之空对象模式
- Java空对象设计模式
- 设计模式之空对象(Null Object)模式
- 【设计模式 - 21】之空对象模式(Null Object)
- Java空对象模式
- Java空对象模式
- java设计模式22_空对象模式
- Java设计模式之------值对象模式
- 设计模式学习笔记--空对象模式
- 设计模式---空对象模式(C++实现)
- 设计模式【空对象模式NullObjectPattern】
- 设计模式(19)--空对象模式
- Java 空对象设计模式(Null Object Pattern) 讲解
- java设计模式之面向对象思想
- 设计模式(3)空对象设计模式
- Java面向对象设计模式之-facade外观模式
- Java设计模式——空对象模式(Null Object Pattern)
- 设计模式:空对象模式(Null Object Pattern)
- 微信硬件开发系列教程04-新浪云服务器搭建(airkiss/airsync)
- java中的static语句块详解
- Android 进度条
- hdu5787 数位dp
- 生成实体类的对象的关系映射(以用户和学生为例)
- java设计模式之空对象模式
- (转)使用Toolbar + DrawerLayout快速实现高大上菜单侧滑
- 网络协议栈设计(一)---前言
- 文件缓冲区
- Web前端复习——Javascript复习(2)
- 微信硬件开发系列教程05-蓝牙nrf51822开发板(airkiss/airsync)
- 图片上传并显示
- 【压箱底】课程设计做的Android五子棋源代码,开源内核
- html5笔记--html介绍