📜  空对象设计模式

📅  最后修改于: 2021-09-10 02:48:33             🧑  作者: Mango

Null 对象模式是一种设计模式,它简化了可以未定义的依赖项的使用。这是通过使用实现已知接口的具体类的实例而不是空引用来实现的。
我们创建一个抽象类,指定要完成的各种操作,扩展这个类的具体类和一个空对象类,提供这个类的任何实现,并将在我们需要检查空值的地方无缝使用。

空对象设计模式的 UML 图

设计组件

  • Client :此类具有可能需要也可能不需要的依赖项。如果依赖项中不需要任何功能,它将执行空对象的方法。
  • DependencyBase :这个抽象类是客户端可能使用的各种可用依赖项的基类。这也是空对象类的基类。在基类不提供共享功能的情况下,它可以用接口代替。
  • Dependency :这个类是一个可以被客户端使用的函数依赖。
  • NullObject :这是可以被客户端用作依赖项的空对象类。它不包含任何功能,但实现了 DependencyBase 抽象类定义的所有成员。

让我们看一个 Null 对象设计模式的例子。

// Java program to illustrate Null
// Object Design Pattern 
  
abstract class Emp
{
    protected String name;
    public abstract boolean isNull();
    public abstract String getName();
}
  
class Coder extends Emp
{
    public Coder(String name) 
    {
        this.name = name;
    }
    @Override
    public String getName() 
    {
        return name;
    }
    @Override
    public boolean isNull() 
    {
        return false;
    }
}
  
class NoClient extends Emp
{
    @Override
    public String getName() 
    {
        return "Not Available";
    }
  
    @Override
    public boolean isNull() 
    {
        return true;
    }
}
  
class EmpData 
{
      
    public static final String[] names = {"Lokesh", "Kushagra", "Vikram"};
    public static Emp getClient(String name)
    {
        for (int i = 0; i < names.length; i++) 
        {
            if (names[i].equalsIgnoreCase(name))
            {
                return new Coder(name);
            }
        }
        return new NoClient();
    }
}
  
public class Main 
{
    public static void main(String[] args) 
    {
        Emp emp1 = EmpData.getClient("Lokesh");
        Emp emp2 = EmpData.getClient("Kushagra");
        Emp emp3 = EmpData.getClient("Vikram");
        Emp emp4 = EmpData.getClient("Rishabh");
  
  
        System.out.println(emp1.getName());
        System.out.println(emp2.getName());
        System.out.println(emp3.getName());
        System.out.println(emp4.getName());
    }
}

输出:

Lokesh
Kushagra
Vikram
Not Available

好处 :

  • 它定义了由真实对象和空对象组成的类层次结构。当对象不执行任何操作时,可以使用空对象代替真实对象。每当客户端代码需要一个真实对象时,它也可以接受一个空对象。
  • 也使客户端代码简单。客户端可以统一对待真实协作者和空协作者。客户通常不知道他们是在与真正的合作者还是空合作者打交道。这简化了客户端代码,因为它避免了编写专门处理空协作者的测试代码。

缺点:

  • 如果您的 AbstractObject 接口没有很好地定义,那么如果各种客户端不同意 null 对象应该如何不做任何事情,则可能难以实现。
  • 可能需要为每个新的 AbstractObject 类创建一个新的 NullObject 类。