介绍
一种称为“空对象模式”的行为设计模式提供了一个对象来表示接口缺少的对象。在空对象会导致空引用异常的情况下,这是一种提供替代行为的方法。在本文中,我们将深入探讨 C# 空对象模式,并逐步解决更复杂的情况。
空对象设计模式它是什么?
一种设计方法是使用 Null 对象模式,它使使用可能未定义的依赖项变得更容易。这不是使用空引用,而是通过使用实现可识别接口的具体类的实例来实现。创建一个概括要执行的不同操作的抽象类,以及扩展它的具体类和一个空对象类,该类提供该类的无操作版本,可用于我们需要检查空值的任何地方。
空对象设计模式的组件
客户
依赖于扩展抽象 DependencyBase 类或实现 Dependency 接口的对象的代码称为客户端。客户端使用此对象执行任务。客户端应该能够以相同的方式处理真实对象和空对象,而无需知道它正在处理哪种对象。
DependencyBase 或抽象依赖
名为 DependencyBase 的抽象类或接口指定了所有具体依赖项(包括空对象)必须实现的方法。此类定义了所有依赖项必须遵守的契约。
依赖还是真实依赖
客户端可以将此类用作功能依赖项。客户端无需知道依赖项对象是实际的还是空的,即可与它们进行交互。
NullObject 或 Null Dependency
这是客户端可用作依赖项的空对象类。虽然它实现了 DependencyBase 抽象类指定的每个成员,但它缺乏功能。系统中为空或不存在的依赖项由 NullObject 表示。客户端可以安全地调用 NullObject 上的方法,而不会导致错误或需要进行空检查。
举例来说
抽象依赖
这是ICar.cs文件的代码。
public interface ICar
{void Drive();void Stop();
}
真实依赖
这是 SedanCar.cs 文件的代码。
public class SedanCar : ICar
{public void Drive(){Console.WriteLine("Drive the sedan car.");}public void Stop(){Console.WriteLine("Stop the sedan car.");}
}
空对象依赖
这是 NullCar.cs 文件的代码。
public class NullCar : ICar
{public void Drive(){}public void Stop(){}
}
客户
这是 CarService.cs 文件的代码。
public class CarService(ICar car)
{private readonly ICar _car = car;public void Run(){Console.WriteLine($"Start run method. {nameof(ICar)}: {_car}");_car.Drive();_car.Stop();Console.WriteLine($"Complete run method. {nameof(ICar)}: {_car}");Console.WriteLine();}
}
程序
这是 Program.cs 文件的代码。
var sedanCar = new SedanCar();
var carService = new CarService(sedanCar);carService.Run();var nullCar = new NullCar();
carService = new CarService(nullCar);carService.Run();
输出
何时应用空对象设计模式?
当您想要提供对象功能的默认或无操作实现以避免空检查并妥善处理空引用时,可以使用空对象设计模式。以下情况需要应用空对象设计模式。
- 默认行为:当对象的实际实现不可用或不合适时,您想要赋予该对象的行为。
- 避免空检查:当您想要提供一个可以安全地代替空引用使用的空对象实现时,您可以避免在代码中执行显式空检查。
- 一致的界面:当您需要让客户访问一个界面时,无论他们使用的是真实对象还是空对象,该界面都保持不变。
- 简化客户端代码:当您希望让客户端代码以与实际对象相同的方式处理空对象,从而使客户端代码免于处理空引用。
何时不应使用空对象设计模式?
在下列情况下,空对象设计模式可能不合适。
- 复杂行为:空对象设计模式旨在提供简单的默认行为;因此,当空对象需要实现复杂的行为或存储状态时,它可能是不可接受的。
- 性能考虑:如果生成和使用空对象会显著增加系统的开销或复杂性,那么最好直接在代码中处理空引用。
- 与真实对象的混淆:如果系统中存在空对象和真实对象可能混淆的可能性,则可能需要进行显式空检查,以提高代码的可读性和清晰度。
概括
空对象模式(一种设计模式)提供了一种可靠的方法来处理对象缺失问题。它通过提供默认行为并消除空值检查的必要性,降低了运行时出错的可能性并简化了客户端代码。为了提高稳定性和可维护性,空对象模式在构建新系统或重组旧系统时可能是一个有用的工具。