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】。
本文介绍空对象模式的概念及其应用场景,并通过一个具体的用户实例演示如何利用空对象模式避免使用NULL值,提供默认行为。
&spm=1001.2101.3001.5002&articleId=53572004&d=1&t=3&u=3e2f86857f2140fe958b492a71b02c68)
748

被折叠的 条评论
为什么被折叠?



