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 类。