设计模式之空对象模式(Null Object Pattern)

设计模式之空对象模式(Null Object Pattern)

存在有道理

  1. 痛点

    class User {
    	public String show(){
    		return "show"
    	}
    }
    public  static String show(User user){
    	if(null!=user)
    		return user.show()
    	return null;
    }
    

    如上的代码我们每天都在写,避免空指针错误
    思考,如果我能保证对象不为空呢,或者为空得时候也是一个特殊得对象,并且有一个最低得方法实现呢,这样,我就不需要到处写空置判断呢,这里应该要配合工厂模式,或者建造者模式,保证生成得对象一定存在

解决方案

空对象模式

  1. 结构图
    设计模式之空对象模式(Null Object Pattern)

  2. 用特殊对象表示空的情况,并且实现对应的方法,这样特殊空情况也能执行方法,这样就不需要判断是否为空了,需要一个生成对象得三种中介类,一般工厂模式等

  3. 上代码

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();
    }
}

  1. 运行结果
    设计模式之空对象模式(Null Object Pattern)

  2. 代码gitee地址:空对象模式demo