设计模式之空对象模式(Null Object Pattern)
设计模式之空对象模式(Null Object Pattern)
存在有道理
-
痛点
class User { public String show(){ return "show" } } public static String show(User user){ if(null!=user) return user.show() return null; }
如上的代码我们每天都在写,避免空指针错误
思考,如果我能保证对象不为空呢,或者为空得时候也是一个特殊得对象,并且有一个最低得方法实现呢,这样,我就不需要到处写空置判断呢,这里应该要配合工厂模式,或者建造者模式,保证生成得对象一定存在
解决方案
空对象模式
-
结构图
-
用特殊对象表示空的情况,并且实现对应的方法,这样特殊空情况也能执行方法,这样就不需要判断是否为空了,需要一个生成对象得三种中介类,一般工厂模式等
-
上代码
public class NullObjectPattern {
public static void main(String[] args) {
//--------------平时我们正常使用得时候--------
DriverFactory factory = new DriverFactory();
Driver driver = factory.normal("cuowude");//传一个错误类型进去
if (null != driver) {
driver.drive();
}
////---------空对象模式----------------
DriverFactory nullObjectFactory=new DriverFactory();
Driver nullObjectDriver=factory.getNullObject("error");
nullObjectDriver.drive();//这里不需要做任何空指针判断,因为对象一定不会为空
}
}
interface Driver {
String PERSION_TYPE = "persion";
String DOG_TYPE = "dog";
void drive();
}
class PersonDriver implements Driver {
@Override
public void drive() {
System.out.println("Persion drive");
}
}
class DogDriver implements Driver {
@Override
public void drive() {
System.out.println("Dog drive");
}
}
class NullDriver implements Driver {
@Override
public void drive() {
System.out.println("Null drive");
}
}
class DriverFactory {
public Driver normal(String driverType) {
switch (driverType) {
case Driver.PERSION_TYPE:
return new PersonDriver();
case Driver.DOG_TYPE:
return new DogDriver();
}
return null;
}
public Driver getNullObject(String driverType) {
switch (driverType) {
case Driver.PERSION_TYPE:
return new PersonDriver();
case Driver.DOG_TYPE:
return new DogDriver();
}
return new NullDriver();
}
}
-
运行结果
-
代码gitee地址:空对象模式demo