空对象模式 当一个对象不存在的时候,用一个空对象取代 null ,以提供默认无任何行为的对象替代品

实现

  • AbstractObject 抽象对象角色,声明协作对象的接口,如果需要,可以实现默认行为
  • ConcreteObject 具体对象角色,具体的协作对象类,提供有意义的行为
  • NullObject 空对象角色,空对象类,继承自 AbstractObject,但接口实现不做任何事情

创建一个抽象类

  1. public abstract class AbstractPhone {
  2. protected String phoneName;
  3. public abstract boolean isNil();
  4. public abstract String getPhoneName();
  5. }

创建扩展了上述类的实体类

  1. public class ExistingPhone extends AbstractPhone {
  2. public ExistingPhone(String phoneName) {
  3. this.phoneName = phoneName;
  4. }
  5. @Override
  6. public boolean isNil() {
  7. return false;
  8. }
  9. @Override
  10. public String getPhoneName() {
  11. return phoneName;
  12. }
  13. }
  1. public class NonexistentPhone extends AbstractPhone {
  2. @Override
  3. public boolean isNil() {
  4. return true;
  5. }
  6. @Override
  7. public String getPhoneName() {
  8. return "后续会增加该厂商手机产线,生产其品牌手机~";
  9. }
  10. }

使用了空对象的工厂类

  1. public class PhoneFactory {
  2. public static final String[] phones = {"小米", "锤子", "苹果"};
  3. public static AbstractPhone getPhone(String name) {
  4. for (String phoneName : phones) {
  5. if (phoneName.equals(name)) {
  6. return new ExistingPhone(name);
  7. }
  8. }
  9. // 空对象设计模式 关键之处
  10. return new NonexistentPhone();
  11. }
  12. }

使用

  1. public class Client {
  2. public static void main(String[] args) {
  3. // 因为没有这个品牌手机的存在,所以订购的对象是ExistingPhone对象,而不是null
  4. AbstractPhone apple = PhoneFactory.getPhone("苹果");
  5. AbstractPhone xiaoMi = PhoneFactory.getPhone("小米");
  6. AbstractPhone chuiZi = PhoneFactory.getPhone("锤子");
  7. AbstractPhone huaWei = PhoneFactory.getPhone("华为");
  8. System.out.println("可以从富士康订购的手机:");
  9. System.out.println(xiaoMi.getPhoneName());
  10. System.out.println(chuiZi.getPhoneName());
  11. System.out.println(huaWei.getPhoneName());
  12. System.out.println(apple.getPhoneName());
  13. }
  14. }

参考

技术文章:菜鸟教程-设计模式Java设计模式—空对象模式