空对象模式 当一个对象不存在的时候,用一个空对象取代 null ,以提供默认无任何行为的对象替代品
实现
- AbstractObject 抽象对象角色,声明协作对象的接口,如果需要,可以实现默认行为
- ConcreteObject 具体对象角色,具体的协作对象类,提供有意义的行为
- NullObject 空对象角色,空对象类,继承自 AbstractObject,但接口实现不做任何事情
创建一个抽象类
public abstract class AbstractPhone {
protected String phoneName;
public abstract boolean isNil();
public abstract String getPhoneName();
}
创建扩展了上述类的实体类
public class ExistingPhone extends AbstractPhone {
public ExistingPhone(String phoneName) {
this.phoneName = phoneName;
}
@Override
public boolean isNil() {
return false;
}
@Override
public String getPhoneName() {
return phoneName;
}
}
public class NonexistentPhone extends AbstractPhone {
@Override
public boolean isNil() {
return true;
}
@Override
public String getPhoneName() {
return "后续会增加该厂商手机产线,生产其品牌手机~";
}
}
使用了空对象的工厂类
public class PhoneFactory {
public static final String[] phones = {"小米", "锤子", "苹果"};
public static AbstractPhone getPhone(String name) {
for (String phoneName : phones) {
if (phoneName.equals(name)) {
return new ExistingPhone(name);
}
}
// 空对象设计模式 关键之处
return new NonexistentPhone();
}
}
使用
public class Client {
public static void main(String[] args) {
// 因为没有这个品牌手机的存在,所以订购的对象是ExistingPhone对象,而不是null
AbstractPhone apple = PhoneFactory.getPhone("苹果");
AbstractPhone xiaoMi = PhoneFactory.getPhone("小米");
AbstractPhone chuiZi = PhoneFactory.getPhone("锤子");
AbstractPhone huaWei = PhoneFactory.getPhone("华为");
System.out.println("可以从富士康订购的手机:");
System.out.println(xiaoMi.getPhoneName());
System.out.println(chuiZi.getPhoneName());
System.out.println(huaWei.getPhoneName());
System.out.println(apple.getPhoneName());
}
}
参考
技术文章:菜鸟教程-设计模式、Java设计模式—空对象模式