Зачем нужен паттерн Visitor?
Не уверен, что на вопрос есть однозначный ответ, но. Вот есть паттерн визитор, хороший пример тут https://code-maze.com/csharp-visitor-design-pattern/
public class BloodSample : ISicknessAlertVisitable
{
//blood sample-specific data and methods
public AlertReport Accept(ISicknessAlertVisitor visitor) => visitor.Visit(this);
}
public class XRayImage : ISicknessAlertVisitable
{
//xray image-specific data and methods
public AlertReport Accept(ISicknessAlertVisitor visitor) => visitor.Visit(this);
}
//and so on for other visitable data elements
public class HivDetector : ISicknessAlertVisitor
{
public AlertReport Visit(BloodSample blood)
{
Console.WriteLine($"{GetType().Name} - Checking blood sample");
//analyze the blood and return correct risk value
return AlertReport.LowRisk;
}
public AlertReport Visit(XRayImage rtg)
{
Console.WriteLine($"{GetType().Name} - currently cannot detect HIV based on X-Ray");
return AlertReport.NotAnalyzable;
}
public AlertReport Visit(EcgReading sample)
{
Console.WriteLine($"{GetType().Name} - Checking heart rate abnormalities");
//analyze the heart beats and return correct risk value
return AlertReport.HighRisk;
}
}
public class TestResultsMonitoringApp
{
private readonly List<ISicknessAlertVisitor> detectors;
public TestResultsMonitoringApp(List<ISicknessAlertVisitor> _detectors)
{
_detectors = detectors;
}
public List<AlertReport> AnalyzeResultsBatch(IEnumerable<ISicknessAlertVisitable> testResults)
{
var alertReports = new List<AlertReport>();
foreach (var sample in testResults)
{
foreach (var detector in _detectors)
{
alertReports.Add(sample.Accept(detector));
}
}
return alertReports;
}
}
И что нам дает паттерн, он не открывает доступ в private/protected полям, как по мне, не задает никаких правил поведений. Чем это будет отличаться от
public class TestResultsMonitoringApp
{
private readonly List<ISicknessAlertVisitor> detectors;
public TestResultsMonitoringApp(List<ISicknessAlertVisitor> _detectors)
{
_detectors = detectors;
}
public List<AlertReport> AnalyzeResultsBatch(IEnumerable<ISicknessAlertVisitable> testResults)
{
var alertReports = new List<AlertReport>();
foreach (var sample in testResults)
{
foreach (var detector in _detectors)
{
alertReports.Add(detector.Analyze(sample));
}
}
return alertReports;
}
}
Где вместо sample.Accept(detector) будет detector.Analyze(sample)
Приходит идея только, что каждый IVisitable может иметь какую-то логику перед вызовом визитера, типа инициализаций полей, но исходя из того, что он не доложен ничего знать о кокретнем визиторе такое выглядит сомнительно