设计模式-空对象模式
时间: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
最后
空对象模式还是比较实用的,可以提升代码的优雅,也可以减少因为空指针异常导致的系流程的中断,是一个比较简单又非常实用的,但是可能是该模式比较少人提起,可以说基本是被人家忘记了,也是极少人知道可能才导致的一种情况,不过空对象的思想还是很不错的。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- bash命令使用详解
- 实例详解Linux 中的命令链接操作符
- Python 为什么不支持 switch 语句?
- centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件的原因分析
- Linux多线程编程快速入门
- Linux添加swap分区的方法
- linux下vsftpd的安装及配置使用详细步骤(推荐)
- Linux分区格式化的命令
- Linux调试工具GDB使用简易教程
- Linux 挂载分区的方法
- 使用Python生成Shell命令,批量执行程序代码解析
- 基于Ubuntu 18.04配置固定IP的方法教程
- 详细解读linux下swap分区的作用
- Linux下将源文件编译成目标文件的过程解析
- Linux使用vim编辑文件保存时报E514:write error (file system full?)问题解决