空对象模式【Java设计模式】
原创
©著作权归作者所有:来自51CTO博客作者日星月云的原创作品,请联系作者获取转载授权,否则将追究法律责任
空对象模式【Java设计模式】
前言
2022/9/25 18:56
2022/9/25 19:19
路漫漫其修远兮,吾将上下而求索
本文是根据袁庭新老师学习所做笔记
仅供学习交流使用,转载注明出处
推荐
袁庭新老师-视频:【Java设计模式】23种Java设计模式,全网最全精讲版本,熬夜爆肝也要学完【10:06:48】
狂神老师-笔记:设计模式【java提高】
空对象模式
在空对象模式(Null Object Pattern)中,一个空对象取代NULL对象实例的检查。Null对象不是检查空值,而是反应一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
实现
我们将创建一个定义操作(在这里,是客户的名称)的AbstractCustomer抽象类,和扩展了AbstractCustomer类的实体类。工厂类CustomerFactory基于客户传递的名字来返回RealCustomer或NullCustomer对象。
NullatternDemo,我们的演示类使用CustomerFactory来演示空对象模式的用法。

1.创建一个项目名称为null_object_pattern的Java项目。
2.创建一个AbstractCustomer抽象类。
package com.js;
/**
* 定义一个抽象类
*/
public abstract class AbstractCustomer {
public String name;
//是否是空值
public abstract boolean isNil();
//获取名称
public abstract String getName();
}
3.创建上述类的实现类
package com.js;
/**
* 表示目标要操作的类
*/
public class RealCustomer extends AbstractCustomer{
public RealCustomer(String name) {
this.name=name;
}
@Override
public boolean isNil() {
return false;
}
@Override
public String getName() {
return name;
}
}
package com.js;
public class NullCustomer extends AbstractCustomer{
@Override
public boolean isNil() {
return true;//是空值
}
@Override
public String getName() {
return "没有定义当前的对象";
}
}
4.创建工厂
package com.js;
public class CustomerFactory {
private static final String[] names={"tom","jack","coco"};
//定义一个方法,根据用户传递的名称来判断当前是否存在此客户
//如果不存在,则抛出指定空对象(NullCustomer)
public static AbstractCustomer getCustomer(String name){
for (int i = 0; i < names.length; i++) {
//如果if成立,则表示目标访问的对象存在(RealCustomer)
if (names[i].equalsIgnoreCase(name)){
return new RealCustomer(name);
}
}
return new NullCustomer();//彻底避免Null对象的产生
}
}
5.编写客户端
package com.js;
public class NullObjectPattern {
public static void main(String[] args) {
AbstractCustomer c1 = CustomerFactory.getCustomer("tom");
System.out.println(c1.getName());
AbstractCustomer c2 = CustomerFactory.getCustomer("marry");
System.out.println(c2.getName());
}
}
6.结果
最后
2022/9/25 20:12
p15
Markdown 2109 字数 163 行数
HTML 1834 字数 90 段落