空对象模式(Null Object Pattern)

  • Post author:
  • Post category:其他



一、空对象模式介绍

1、定义

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

2、作用

  • 它可以加强系统的稳固性,能有有效地防止空指针报错对整个系统的影响,使系统更加稳定;
  • 它能够实现对空对象情况的定制化的控制,能够掌握处理空对象的主动权;
  • 它并不依靠Client来保证整个系统的稳定运行;
  • 它通过isNull对==null的替换,显得更加优雅,更加易懂;


二、代码示例

1、不用空对象模式情况

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;
    }

    /**
     * 
     * Description About show: <br>
     * 展示图书的相关信息
     * 
     * @version V1.0
     */
    public void show() {
        System.out.println(ID + "**" + name + "**" + author);
    }

}
public class BookFactory {
    /**
     * 
     * Description About getBook: <br>
     * 根据ConcreteBook的ID,获取图书对象。
     * @param ID 图书的ID
     * @return 图书对象
     * @version V1.0
     */

    public ConcreteBook getBook(int ID) {
        ConcreteBook book = null;
        switch (ID) {
        case 1:
            book = new ConcreteBook(ID, "设计模式", "GoF");
            break;
        case 2:
            book = new ConcreteBook(ID, "被遗忘的设计模式", "Null Object Pattern");
            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();
    }

}

当吧ConcreteBook book = bookFactory.getBook(1);中的1改为-1,会出现空指针错误;

2、使用空对象模式

interface Book {
    // 判断Book对象是否为空对象(Null Object)
    public boolean isNull();

    // 展示Book对象的信息内容。
    public void show();
}
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;
    }

    /**
     * 
     * Description About show: <br>
     * 展示图书的相关信息
     * 
     * @version V1.0
     */
    public void show() {
        System.out.println(ID + "**" + name + "**" + author);
    }
    public boolean isNull(){
        return false;
    }
}
public class BookFactory {
    /**
     * Description About getBook: <br>
     * 根据ConcreteBook的ID,获取图书对象。
     * @param ID 图书的ID
     * @return 图书对象
     * @version V1.0
     */

    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, "被遗忘的设计模式", "Null Object Pattern");
            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();
    }



版权声明:本文为qq_33923684原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。