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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值