空对象模式 当一个对象不存在的时候,用一个空对象取代 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;}@Overridepublic boolean isNil() {return false;}@Overridepublic String getPhoneName() {return phoneName;}}
public class NonexistentPhone extends AbstractPhone {@Overridepublic boolean isNil() {return true;}@Overridepublic 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对象,而不是nullAbstractPhone 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设计模式—空对象模式
