空对象模式

空对象模式(Null Object Pattern)

Null Object Pattern,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。

package com.xxx;  
  
/**  
 * @Description 1.定义一个抽象类  
 * 空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。  
 * 为什么使用这个模式?还需要null吗?  
 * 这个模式可以消除重复。如果多个地方要判空。  
 * 空对象模式是通过实现一个默认的无意义对象来避免null值出现, 简单地说,就是为了避免在程序中出现null值判断而诞生的一种常用设计方法.  
 * 另外一个好处就是方便做测试,  
 * * 增加了NullUser类后, 在User类中就不需要"user != null"这句话了, 因为我们提供了一个实现接口的所有方法, 不会再产生null对象. 想象一个web项目中, user对象可能由MVC框架映射产生, 我们只要定义一个默认的映射对象是NullUser, 就可以解决控制判断的问题, 提升代码的可读性. 这就是空对象模式, 非常简单, 但非常实用.   
 */public abstract class AbstractUser {  
    protected String name;  
  
    /**  
     * 是否为null  
     * @return  
     */  
    public abstract boolean isNil();  
  
    /**  
     * 获取名字  
     * @return  
     */  
    public abstract String getName();  
}

package com.xxx;  
  
import com.qf.AbstractCustomer;  
  
/**  
 * @Description 2.继承扩展,真实用户  
 */public class RealUser extends AbstractUser {  
  
    public RealUser(String name){  
        this.name = name;  
    }  
    @Override  
    public boolean isNil() {  
        return false;  
    }  
  
    @Override  
    public String getName() {  
        return name;  
    }  
}
package com.xxx;  
  
import com.qf.AbstractCustomer;  
  
/**  
 * @Description 3.继承扩展,空用户    
 */public class NullUser extends AbstractUser {  
    @Override  
    public boolean isNil() {  
        return true;  
    }  
  
    @Override  
    public String getName() {  
        return "空";  
    }  
}

package com.xxx;  
  
  
/**  
 * @Description 4.创建用户工厂  
 */public class UserFactory {  
    public static final String[] names = {"张三", "李四", "王五"};  
  
    public static AbstractUser getUser(String name){  
        for (int i = 0; i < names.length; i++) {  
            if (names[i].equalsIgnoreCase(name)) {  
                return new RealUser(name);  
            }  
        }        return new NullUser();  
    }  
}

package com.xxx;  
  
/**  
 * @Description 5.通过名字,来获取 RealUser 或 NullUser 对象。   
 */public class Test {  
    public static void main(String[] args) {  
        AbstractUser lisi = UserFactory.getUser("李四");  
        AbstractUser lufei = UserFactory.getUser("路飞");  
  
        System.out.println(lisi.getName());  
        System.out.println(lufei.getName());  
    }  
}
posted @ 2023-01-28 12:10  Ritchie^._.^  阅读(32)  评论(0)    收藏  举报