Нулевой объект – это объект с заданным нейтральным поведением, использование которого позволяет заменить условные операторы полиморфизмом.
Рассмотрим следующий пример. Пусть имеется система классов для протоколирования и метод-фабрика, возвращающий в зависимости от параметра объект заданного класса.
public abstract class BaseLogger
{
public abstract void Write(string logEntry);
}
public class FileLogger: BaseLogger
{
public override void Write(string logEntry)
{
Console.WriteLine(logEntry + "is written into the file");
}
}
public class EmailLogger: BaseLogger
{
public override void Write(string logEntry)
{
Console.WriteLine(logEntry + "is sent by email");
}
}
public static class LoggerFactory
{
public static BaseLogger GetLogger(string name)
{
switch (name)
{
case "file":
return new FileLogger();
case "email":
return new EmailLogger();
default:
return null;
}
}
}
Использование кода в указанном виде приводит к условным операторам, обеспечивающим корректное поведение в том случае, если метод GetLogger() вернул значение null.
BaseLogger logger = LoggerFactory.GetLogger("abc");
if (logger!= null)
{
logger.Write("message");
}
else
{
Console.WriteLine("Cannot write in the log");
}
Устранить условные операторы поможет введение специального класса с поведением по умолчанию:
public class DefaultlLogger: BaseLogger
{
public override void Write(string logEntry)
{
Console.WriteLine("Cannot write in the log");
}
}
public static class LoggerFactory
{
public static BaseLogger GetLogger(string name)
{
switch (name)
{
case "file":
return new FileLogger();
case "email":
return new EmailLogger();
default:
return new DefaultlLogger();
}
}
}