网站首页 > 技术文章 正文
本文节选自《设计模式就该这样学》
1 空对象模式的定义
空对象模式(Null Object Pattern)不属于GoF设计模式,但是它作为一种经常出现的模式足以被视为设计模式了。其具体定义为设计一个空对象取代NULL对象实例的检查。NULL对象不是检查控制,而是反映一个不做任何动作的关系。这样的NULL对象也可以在数据不可用的时候提供默认的行为,属于行为型设计模式。
原文:Provide an object as a surrogate for the lack of an object of a given type. The Null object provides intelligent do nothing behavior, hiding the details from its collaborators.
2 空对象模式的应用场景
空对象模式适用于以下应用场景。
(1)对象实例需要一个协作实例。空对象模式不会引入协作实例,它只是使用现有的协作实例。
(2)部分协作实例不需要做任何处理。
(3)从客户端中将对象实例不存在的代码逻辑抽象出来。
3 空对象模式的UML类图
空对象模式的UML类图如下图所示。
由上图可以看到,空对象模式主要包含3个角色。
(1)抽象对象(AbstractObject):定义所有子类公有的行为和属性。
(2)真实对象(RealObject):继承AbstractObject类,并实现所有行为。
(3)空对象(NullObject):继承AbstractObject类,对父类方法和属性不做实现和赋值。
4 空对象模式的通用写法
以下是空对象模式的通用写法。
public class Client {
public static void main(String[] args) {
ObjectFactory factory = new ObjectFactory();
System.out.println(factory.getObject("Joe").isNill());
System.out.println(factory.getObject("Tom").isNill());
}
//抽象对象
static abstract class AbstractObject{
abstract void request();
abstract boolean isNill();
}
//空对象
static class NullObject extends AbstractObject{
public void request() {
System.out.println("Not Available Request");
}
boolean isNill() {
return true;
}
}
//真实对象
static class RealObject extends AbstractObject{
private String name;
public RealObject(String name) {
this.name = name;
}
public void request() {
System.out.println("Do samething...");
}
boolean isNill() {
return false;
}
}
//对象工厂
static class ObjectFactory{
private static final String[] names = {"Tom","Mic","James"};
public AbstractObject getObject(String name){
for (String n : names) {
if(n.equalsIgnoreCase(name)){
return new RealObject(name);
}
}
return new NullObject();
}
}
}
5 空对象模式的优点
(1)它可以加强系统的稳固性,能有效地减少空指针报错对整个系统的影响,使系统更加稳定。
(2)它能够实现对空对象情况的定制化的控制,掌握处理空对象的主动权。
(3)它并不依靠Client来保证整个系统的稳定运行。
(4)它通过定义isNull()对使用条件语句==null的替换,显得更加优雅,更加易懂。
6 空对象模式的缺点
每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加类的数量。
关注微信公众号『 Tom弹架构 』回复“设计模式”可获取完整源码。
【推荐】Tom弹架构:30个设计模式真实案例(附源码),挑战年薪60W不是梦
本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。私信回复"666"或关注微信公众号『 Tom弹架构 』可获取更多技术干货!
猜你喜欢
- 2024-09-18 面试时被问到单例模式,怎么回答才能让面试官眼前一亮?
- 2024-09-18 JVM系列之:对象的锁状态和同步(对象锁和方法锁)
- 2024-09-18 心理测试:四个卫生间你会选择哪一个,测出你是一个怎样的人!
- 2024-09-18 用这个方法,发现你命中注定的另一半
- 2024-09-18 Mybatis为什么查询结果为空时返回值为NULL或空集合?
- 2024-09-18 ES6对象拦截器 Proxy(electron拦截请求)
- 2024-09-18 求教!CAD多段线在布局视口中变成了“空心”,怎么办
- 2024-09-18 张明楷刑法笔记(13-15)结果、因果关系、结果归属
- 2024-09-18 Mybatis查询结果为空时,为什么返回值为NULL或空集合?
- 2024-09-18 一个单相思的女孩,写给暗恋对象的信
- 1513℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 561℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 506℃MySQL service启动脚本浅析(r12笔记第59天)
- 485℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 483℃启用MySQL查询缓存(mysql8.0查询缓存)
- 463℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 443℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 440℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)