设计模式-空对象模式

时间:2022-07-25
本文章向大家介绍设计模式-空对象模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

上文(设计模式-状态模式):设计模式-观察者模式


背景

一般情况在编写代码的时候判断为空需要通过null==来判断,而这样的写法很难看,一眼看下去几百行代码,密密麻麻都是这些判断,代码很不优雅,有时还漏判还会导致空指导异常。这个问题,java的空对象模式很不错的解决方案,可以做到优雅判断。

空对象模式是什么?

空对象模式(Null Object Pattern)提供一个给定类型的空对象代理,这个空对象不执行任何动作,对他的合作对象隐藏细节。

角色

AbstractObject:声明对象的接口

RealObject:具体的协作对象类,提供有意义的行为。

NullObject:空对象类,对AbstractObject进行继承;

Factory:工厂类,进行对象创建,r返回是空还是具体对象。

Client:请求协助对象

空对象模式可以干嘛?

空对象主要是解决由于对象为空而导致空指针,有时候缺少判断导致系统流程无法进行下去,而影响了整体系统性能,还有可以提升代码优雅。

优点:

增加系统鲁棒性,可以增加系统稳定性,防止因为空异针或者对象为空而导致的对系统流程的影响,并且能够通过控制空对象,通过定制化处理。

使代码更优雅可以通过.isNull 取代null==对象这种。

缺点:

暂时没有发现

个人理解:

如果要将该空对象比较现实中的电视台,找不到的电视台类似空对象,而有的就是具体的,而遥控器就类似于工厂转换,用户就是我们自己。

空对象模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

/**
 * @Auther: csh
 * @Date: 2020/6/17 10:20
 * @Description:(AbstractObject)抽象接口
 */
public interface Tv {    
  //是否为空    
  boolean isNull();   
   //电视台    
   String getTvStation();
}
/**
 * @Auther: csh
 * @Date: 2020/6/17 10:21
 * @Description:空对象(NullObject)
 */
public class NullTv implements Tv {
    @Override
    public boolean isNull() {
        return true;
    }

    @Override
    public String getTvStation() {
        return "该电视台不存在,请切换其他电视台观看!";
    }
}
/**
 * @Auther: csh
 * @Date: 2020/6/17 10:22
 * @Description:具体实现(RealObject)
 */
public class ViewTv implements Tv {

    private String name;

    private Integer number;

    public ViewTv(String name, Integer number) {
        this.name = name;
        this.number = number;
    }

    @Override
    public boolean isNull() {
        return false;
    }

    @Override
    public String getTvStation() {
        return "为您播放"+name+"台数"+number;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/6/17 10:24
 * @Description:电视台工厂(Factory)
 */
public class TvFactory {

    public Tv getTv(Integer number){
        Tv tv;
        switch (number){
            case 1:
                tv = new ViewTv("中央一台",1);
                break;
            case 2:
                tv = new ViewTv("中央二台",2);
            default:
                tv = new NullTv();
                break;
        }
        return tv;
    }
}


/**
 * @Auther: csh
 * @Date: 2020/6/17 10:26
 * @Description:电视台演示
 */
public class Client {
    public static void main(String[] args) {
        TvFactory tvFactory = new TvFactory();
        Tv tv = tvFactory.getTv(1);
        if(!tv.isNull()){
            System.out.println(tv.getTvStation());
        }else{
            System.out.println("电视台不存在!");
        }
        Tv tv1 = tvFactory.getTv(111);
        if(!tv1.isNull()){
            System.out.println(tv1.getTvStation());
        }else{
            System.out.println("电视台不存在!");
        }

    }
}

结果

为您播放中央一台台数1
该电视台不存在,请切换其他电视台观看!

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

最后

空对象模式还是比较实用的,可以提升代码的优雅,也可以减少因为空指针异常导致的系流程的中断,是一个比较简单又非常实用的,但是可能是该模式比较少人提起,可以说基本是被人家忘记了,也是极少人知道可能才导致的一种情况,不过空对象的思想还是很不错的。