空对象模式

定义:当你在处理可能会出现null的对象时,可能要产生相对乏味的代码来做相应的处理,使用空对象模式可以接受null,并返回相应的信息。空对象模式通常会作为一个单独的空对象类,封装一个默认的行为。通过判断条件来返回不同的对象,空则返回空对象NullCustomer,非空返回RealCustomer,这样避免在客户端调用(XXX == null)这种判空操作。


结构图:

优点:这个模式可以消除重复。想象一下,假如有多个消费端,每个消费端都要判断一下是否为空,而且对于为空的场景要做特殊的处理,这样就会导致很多重复。一些例子是:日志对象和缓存对象、图书馆查书系统、查询系统。方便做测试,这些Null Object类似Stub Object。

使用:以下案例通过工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。判断条件为CustomerFactory 是否存在客户的名字。
1.创建一个对象抽象类:

public abstract class AbstractCustomer 
{
   protected String name;
   public abstract boolean isNull();
   public abstract String getName();
}

2.创建对象的实体类,非空和空对象类:

public class RealCustomer extends AbstractCustomer 
{
   public RealCustomer(String name) 
  {
      this.name = name;
   }

   public Override  String getName() 
  {
      return name;
   }

   public Override boolean isNull() 
  {
      return false;
   }
}

public class NullCustomer extends AbstractCustomer 
{
    public Override String getName() 
   {
      return "Not Available in Customer Database";
   }

   public Override boolean isNull() 
   {
      return true;
   }
}

3.创建 CustomerFactory 类:判断是生成空对象还是非空对象的类

public class CustomerFactory 
{
   public static final String[] names = {"Rob", "Joe", "Julie"};

   public static AbstractCustomer getCustomer(String name)
   {
      for (int i = 0; i < names.length; i++) {
         if (names[i].equalsIgnoreCase(name))
        {
            return new RealCustomer(name);
         }
      }
      return new NullCustomer();
   }
}    

4.使用 CustomerFactory,基于客户传递的名字,来获取 RealCustomer 或 NullCustomer 对象。

public class NullPatternDemo 
{
   public static void main(String[] args) 
 { AbstractCustomer customer1
= CustomerFactory.getCustomer("Rob"); AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob"); AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie"); AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura"); System.out.println("Customers"); System.out.println(customer1.getName()); System.out.println(customer2.getName()); System.out.println(customer3.getName()); System.out.println(customer4.getName()); } }
一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
原文地址:https://www.cnblogs.com/wang-jin-fu/p/8321090.html