.NET Core 中的 Null 对象设计模式

作者:微信公众号:【架构师老卢】
8-28 15:7
13

概述:一种称为 Null Object Pattern 的行为设计模式提供了一个对象来表示接口的缺失对象。如果 null 对象会导致 null 引用异常,则这是提供替代行为的一种方法。在本文中,我们将深入探讨 C# Null Object 模式,逐步介绍更复杂的情况。Null 对象设计模式:它是什么?一种使使用可能未定义的依赖项更容易的设计方法是 Null 对象模式。这是通过使用实现已识别接口的具体类的实例来实现的,而不是使用 null 引用。创建一个抽象类,其中概述了要执行的不同操作,以及扩展它的具体类和一个空对象类,该类提供了该类的无所事事版本,可以在我们需要检查空值的任何地方使用。Null O

一种称为 Null Object Pattern 的行为设计模式提供了一个对象来表示接口的缺失对象。如果 null 对象会导致 null 引用异常,则这是提供替代行为的一种方法。在本文中,我们将深入探讨 C# Null Object 模式,逐步介绍更复杂的情况。

Null 对象设计模式:它是什么?

一种使使用可能未定义的依赖项更容易的设计方法是 Null 对象模式。这是通过使用实现已识别接口的具体类的实例来实现的,而不是使用 null 引用。创建一个抽象类,其中概述了要执行的不同操作,以及扩展它的具体类和一个空对象类,该类提供了该类的无所事事版本,可以在我们需要检查空值的任何地方使用。

Null Object Design 模式的组件

客户

依赖于扩展抽象 DependencyBase 类或实现 Dependency 接口的对象的代码称为客户端。客户端使用此对象来执行任务。Client 端应该能够以相同的方式处理 real 和 null 对象,而不必知道它正在处理哪种类型的对象。

DependencyBase 或 Abstract 依赖项

名为 DependencyBase 的抽象类或接口指定必须由所有具体依赖项(包括 null 对象)实现的方法。所有依赖项都必须遵守的协定由此类定义。

依存关系或实际依存关系

Client 可以将此类用作函数依赖项。客户端无需知道 Dependency 对象是 actual 还是 null 即可与它们交互。

NullObject 或 Null 依赖项

这是客户端可以用作依赖项的 null 对象的类。虽然它实现了 DependencyBase 抽象类指定的每个成员,但它缺乏功能。系统中的 null 或不存在的依赖项由 NullObject 表示。客户端可以安全地调用 NullObject 上的方法,而不会导致错误或需要 null 检查。

举个例子,

抽象依赖

下面是 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.");  
    }  
}

Null 对象依赖关系

下面是 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();

何时为 Null 对象应用设计模式?

如果要提供对象功能的默认或无操作实现以避免 null 检查并正常处理 null 引用,可以使用 Null 对象设计模式。以下情况需要应用 Null 对象设计模式。

  • 默认行为: 这是在对象的实际实现不可用或不适当的情况下,您希望为其提供的行为。
  • 避免 Null 检查: 当您希望提供可以安全地用于代替 null 引用的 null 对象实现时,可以避免在代码中执行显式 null 检查。
  • 一致的界面: 当您需要为客户提供对界面的访问权限时,无论他们使用的是 real 对象还是 null 对象,该界面都保持不变。
  • 简化客户端代码: 当您希望通过让客户端代码以与实际对象相同的方式处理 null 对象来避免客户端代码处理 null 引用时。

何时不应使用 Null Object Design Pattern?

Null 对象设计模式可能不适用于以下情况。

  • 复杂的行为: Null 对象设计模式旨在提供简单的默认行为;因此,当 null 对象需要实现复杂的行为或 store state 时,这可能是不可接受的。
  • 性能注意事项: 如果生成和利用 null 对象会显著增加系统中的开销或复杂性,则最好直接在代码中处理 null 引用。
  • 与真实物体的混淆: 如果 null 对象和真实对象在系统中可能会混淆,则显式 null 检查可能更可取,以提高代码的可读性和清晰度。

Null Object Pattern(一种设计模式)提供了一种处理缺少对象的可靠方法。它通过提供默认行为并消除 null 检查的必要性,降低了运行时错误的可能性并简化了客户端代码。为了提高稳定性和可维护性,在构建新系统或重构旧系统时,Null Object Pattern 可能是一个有用的工具。

阅读排行