背景
一般情况在编写代码的时候判断为空需要通过null==来判断,而这样的写法很难看,一眼看下去几百行代码,密密麻麻都是这些判断,代码很不优雅,有时还漏判还会导致空指导异常。这个问题,java的空对象模式很不错的解决方案,可以做到优雅判断。
空对象模式是什么?
空对象模式(Null Object Pattern)提供一个给定类型的空对象代理,这个空对象不执行任何动作,对他的合作对象隐藏细节。
角色
AbstractObject:声明对象的接口
RealObject:具体的协作对象类,提供有意义的行为。
NullObject:空对象类,对AbstractObject进行继承;
Factory:工厂类,进行对象创建,r返回是空还是具体对象。
Client:请求协助对象
空对象模式可以干嘛?
空对象主要是解决由于对象为空而导致空指针,有时候缺少判断导致系统流程无法进行下去,而影响了整体系统性能,还有可以提升代码优雅。
优点:
增加系统鲁棒性,可以增加系统稳定性,防止因为空异针或者对象为空而导致的对系统流程的影响,并且能够通过控制空对象,通过定制化处理。
使代码更优雅可以通过.isNull 取代null==对象这种。
缺点:
暂时没有发现
个人理解:
如果要将该空对象比较现实中的电视台,找不到的电视台类似空对象,而有的就是具体的,而遥控器就类似于工厂转换,用户就是我们自己。
空对象模式类图
实现代码
/**
* @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
该电视台不存在,请切换其他电视台观看!
最后
空对象模式还是比较实用的,可以提升代码的优雅,也可以减少因为空指针异常导致的系流程的中断,是一个比较简单又非常实用的,但是可能是该模式比较少人提起,可以说基本是被人家忘记了,也是极少人知道可能才导致的一种情况,不过空对象的思想还是很不错的。