当前位置: 首页 > news >正文

空对象模式

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

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

实现

我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类。工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。NullPatternDemo 我们的演示类使用 CustomerFactory 来演示空对象模式的用法。

null_pattern_uml_diagram

创建 AbstractCustomer 抽象类。

public abstract class AbstractCustomer {protected String name;public abstract boolean isNil();public abstract String getName();
}

RealCustomer 继承 AbstractCustomer 对其进行扩展:

public class RealCustomer extends AbstractCustomer {public RealCustomer(String name) {this.name = name;    }@Overridepublic String getName() {return name;}@Overridepublic boolean isNil() {return false;}
}

NullCustomer 继承 AbstractCustomer 对其进行扩展:

public class NullCustomer extends AbstractCustomer {@Overridepublic String getName() {return "Not Available in Customer Database";}@Overridepublic boolean isNil() {return true;}
}

创建 CustomerFactory 类:

public class CustomerFactory {public static final String[] names = {"Rob", "Joe", "Julie"};public static AbstractCustomer getCustomer(String name){for (int i = 0; i < names.length; i++) {if (names[i].equalsIgnoreCase(name)){return new RealCustomer(name);}}return new NullCustomer();}
}

使用 CustomerFactory,基于客户传递的名字,来获取 RealCustomer 或 NullCustomer 对象:

public class NullPatternDemo {public static void main(String[] args) {AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob");AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob");AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie");AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura");System.out.println("Customers");System.out.println(customer1.getName());System.out.println(customer2.getName());System.out.println(customer3.getName());System.out.println(customer4.getName());}
}

执行程序,输出结果:

Customers
Rob
Not Available in Customer Database
Julie
Not Available in Customer Database
http://www.lryc.cn/news/519104.html

相关文章:

  • 开启Excel导航仪,跨表跳转不迷路-Excel易用宝
  • 年度技术突破奖|中兴微电子引领汽车芯片新变革
  • Ubuntu 如何查看盘是机械盘还是固态盘
  • 计算机网络(三)——局域网和广域网
  • STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信
  • 将光源视角的深度贴图应用于摄像机视角的渲染
  • docker一键安装脚本(docker安装)
  • 【SY2】Apollo10.0 Cyber基于Writer/Reader的通信方式
  • 【YOLOv8杂草作物目标检测】
  • 在Java中实现集合排序
  • el-descriptions-item使用span占行不生效
  • Android 绘制学习总结
  • Linux下部署SSM项目
  • 计算机网络 笔记 数据链路层 2
  • xml简介
  • 透明部署、旁路逻辑串联的区别
  • 【网络安全渗透测试零基础入门】之XSS攻击获取用户cookie和用户密码(实战演示)
  • c#版本、.net版本、visual studio版本之间的对应关系
  • 熵与交叉熵:从不确定性角度理解 KL 散度
  • Redis:数据类型
  • 搭建Node.js后端
  • 集合——数据结构
  • 从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)
  • 《机器学习》——支持向量机(SVM)
  • 【PPTist】公式编辑、插入音视频、添加动画
  • LeetCode - #186 翻转字符串里的单词 II(会员题)
  • Kafka核心参数与使用02
  • Three.js 渲染技术:打造逼真3D体验的幕后功臣
  • QTcpSocket 如何统计在线时长
  • 【Altium】AD使用智能粘贴功能把多个网络标签改成端口