java设计模式之空对象模式

一、问题引入

在我们日常的编码过程中,我们经常会写出类似如下代码

Object object = map.get(index);

if(object  != null){

    //调用test方法
    object.test() 
     

}

从上面的代码我们可以看到,我们获取到一个object对象时,需要先对它进行空判断,然后在对object对象进行操作,如果不尽兴判空操作,直接对object对象,有可能会报空指针异常。

二、问题解决

为了解决上面的问题,假如我们客户端不想做判空操作。我们是否可以要求map在获取不到对象的数据,不返回null对象给我们,而是返回一个无用的空对象类,仅仅是用来告诉我们从map中找不到数据。而这种解决办法就是空对象设计模式的思想

三、定义

创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。

四、模式解读

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

五、代码案例

我们就用现实生活中买车的情况来编写这个案例,车店里有宝马,沃尔沃的车,但是没有特斯拉的新能源车,小明去买车,当他买前面两种车时,直接提车,买特斯拉则被提醒没有店里没有特斯拉。

package nullObject;

/**
 * @Package: nullObject
 * @ClassName: Car
 * @Author: tanp
 * @Description: 抽象类
 * @Date: 2020/11/20 17:42
 */
public abstract class Car {
    public abstract String getName();
}

package nullObject;

/**
 * @Package: nullObject
 * @ClassName: NullCar
 * @Author: tanp
 * @Description: 模拟不做任何实现的空对象类
 * @Date: 2020/11/20 17:53
 */
public class NullCar extends Car {

    @Override
    public String getName(){
        return "没有这一款车";
    }
}


package nullObject;

/**
 * @Package: nullObject
 * @ClassName: WoErWo
 * @Author: tanp
 * @Description: 模拟扩展抽象类的实体类,沃尔沃汽车
 * @Date: 2020/11/20 17:50
 */
public class WoErWo extends Car {

    private String name;

    public WoErWo(String name) {
        this.name = name;
    }

    @Override
    public String getName(){
        return this.name;
    }
}

package nullObject;

/**
 * @Package: nullObject
 * @ClassName: BaoMa
 * @Author: tanp
 * @Description: 模拟扩展抽象类的实体类,宝马汽车
 * @Date: 2020/11/20 17:46
 */
public class BaoMa extends Car {

    private String name;

    public BaoMa(String name) {
        this.name = name;
    }

    @Override
    public String getName(){
        return this.name;
    }
}

package nullObject;

/**
 * @Package: nullObject
 * @ClassName: CarShop
 * @Author: tanp
 * @Description: 车店
 * @Date: 2020/11/20 18:00
 */
public class CarShop {

    public static Car getCar(String name) {
        if (name.equals("BaoMa")) {
            return new BaoMa(name);
        }
        if (name.equals("WoErWo")) {
            return new WoErWo(name);
        }
        return new NullCar();
    }
}

package nullObject;

/**
 * @Package: nullObject
 * @ClassName: DemoClient
 * @Author: tanp
 * @Description: ${description}
 * @Date: 2020/11/20 18:04
 */
public class DemoClient {

    public static void main(String[] args) {
        Car baoma = CarShop.getCar("BaoMa");
        System.out.println(baoma.getName());
        Car woerwo = CarShop.getCar("WoErWo");
        System.out.println(woerwo.getName());
        Car telasi = CarShop.getCar("tesila");
        System.out.println(telasi.getName());
    }
}


结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值