【设计模式 - 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】

posted on 2016-12-22 14:46  ITGungnir  阅读(234)  评论(0编辑  收藏  举报

导航