【设计模式 - 21】之空对象模式(Null Object)
1、模式简介
在空对象模式中,一个空对象取代NULL对象的实例的检查。NULL对象不是检查空值,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
空对象模式一般和策略模式或工厂模式结合使用。
2、案例
在这个例子中,我们使用工厂,根据姓名初始化用户,如果姓名在要求范围内,则生成一个用户,否则生成一个空对象的用户。具体代码如下:
用户抽象父类User中的代码:
public abstract class User { protected String name; public User(String name) { this.name = name; } public abstract void introduce(); }
真实用户类RealUser中的代码:
public class RealUser extends User { public RealUser(String name) { super(name); } @Override public void introduce() { System.out.println("My Name Is " + super.name); } }
空用户类NullUser中的代码:
public class NullUser extends User { public NullUser(String name) { super(name); } @Override public void introduce() { System.out.println("I am a NULL Object!!!!"); } }
用户工厂类UserFactory中的代码如下:
public class UserFactory { private static final String[] NAME_LIMIT = { "Jack", "Rose", "Tom" }; private static UserFactory instance; private UserFactory() { } public static UserFactory getInstance() { if (instance == null) { synchronized (UserFactory.class) { if (instance == null) { instance = new UserFactory(); } } } return instance; } public User getUserByName(String name) { User user = new NullUser(name); for (String n : NAME_LIMIT) { if (n.equals(name)) { user = new RealUser(name); } } return user; } }
测试类Test中的代码:
public class Test { public static void main(String[] args) { User user1 = UserFactory.getInstance().getUserByName("Jack"); user1.introduce(); User user2 = UserFactory.getInstance().getUserByName("Rose"); user2.introduce(); User user3 = UserFactory.getInstance().getUserByName("Tom"); user3.introduce(); User user4 = UserFactory.getInstance().getUserByName("Jerry"); user4.introduce(); } }
运行结果如下图所示:
下面贴出空对象模式代码的GitHub地址:【GitHub - Null Object】。