Зачем нужен паттерн 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 может иметь какую-то логику перед вызовом визитера, типа инициализаций полей, но исходя из того, что он не доложен ничего знать о кокретнем визиторе такое выглядит сомнительно


Ответы (0 шт):