设计模式:空对象与模板方法模式解析
1. 空对象模式
1.1 空对象模式描述
在大多数计算机编程语言中,“null” 用于表示不存在的对象。当客户端期望使用类层次结构中的不同子类来执行不同行为,并将这些子类作为父类类型的对象引用时,有时可能在客户端需要子类实例时,该实例不可用,此时客户端接收到的就是不存在的对象或 “null”。当返回 “null” 时,客户端无法像返回真实对象那样调用方法,因此在调用对象的任何方法之前,客户端需要检查该对象是否为 “null”。在遇到 “null” 的情况下,客户端要么提供一些默认行为,要么不做任何操作。
空对象模式建议将默认(通常是不做任何操作)行为封装到一个单独的类中,这个类被称为空对象类。该类可以设计为类层次结构中的一个子类。空对象类提供与其他子类相同的方法集,但对其方法采用默认(或不做任何操作)的实现。有了空对象,当没有具有实际实现的子类可用时,空对象会提供给客户端。这种安排消除了客户端收到不存在对象的可能性,因此客户端无需检查接收到的对象是否为 “null”(或不存在)。由于空对象提供了与其他子类对象相同的接口,客户端可以统一处理它们。
1.2 消息日志记录工具示例
1.2.1 原始设计
消息日志记录工具的设计主要由 Logger
接口及其两个实现类 FileLogger
和 ConsoleLogger
组成,分别用于将消息记录到文件和控制台。此外,还有 LoggerFactory
类(清单 37.1),其中包含一个工厂方法。当客户端请求时,工厂方