空对象设计模式

空对象Null Object设计模式是一种行为设计模式,它提供一个对象作为引用缺失的替代。它不使用来表示对象的缺失,而是使用预定义的“空对象”。此对象实现与常规对象相同的接口,不执行任何操作或提供默认行为。空对象模式避免了空检查,使代码更简洁,并降低了出现null或其他类似NullPointerException错误的风险。

关键概念

  1. 空对象:这是实现特定接口或从特定类继承但具有中性行为(不执行任何操作)的类。此空对象替换引用null。
  2. 客户端代码:使用对象并期望它们遵循特定接口的代码,允许它与真实对象或空对象交替工作而无需条件逻辑。

优点

  • 简化代码:消除客户端代码中的空检查,使其更简单、更易于阅读。
  • 防止NullPointerException错误:通过系统地处理空引用来减少类似错误的机会。
  • 解耦:客户端代码不需要知道它是在处理真实对象还是空对象。

示例场景
想象一下,在某个应用程序中,一些用户是高级用户,而另一些用户是标准用户。高级用户拥有附加功能,但标准用户可能缺少某些数据。为了避免对高级用户和标准用户进行检查,我们可以对标准用户应用 Null Object 模式。

// Step 1: Define the User interface
interface User {
    void showDetails();
}

// Step 2: Create the RealUser class that implements User
class RealUser implements User {
    private String name;

    public RealUser(String name) {
        this.name = name;
    }

    @Override
    public void showDetails() {
        System.out.println(
"User: " + name);
    }
}

// Step 3: Create the NullUser class that also implements User
class NullUser implements User {
    @Override
    public void showDetails() {
        System.out.println(
"No user found.");
    }
}

// Step 4: Implement a User Factory to return RealUser or NullUser
class UserFactory {
    public static User getUser(String name) {
        if (name == null || name.isEmpty()) {
            return new NullUser();
        }
        return new RealUser(name);
    }
}

// Step 5: Client code
public class Main {
    public static void main(String[] args) {
        User user1 = UserFactory.getUser(
"Anubhav");
        User user2 = UserFactory.getUser(
""); // returns NullUser

        user1.showDetails();
// Output: User: Anubhav
        user2.showDetails();
// Output: No user found.
    }
}


何时使用

  • 当某个对象可能丢失或不需要时,您想要避免空检查。
  • 当对象的存在或不存在不应改变应用程序的流程时。
  • 对于具有默认或空行为的场景,例如处理集合中的缺失值或责任链结构中的空实例。