Шаблон дизайна посетителя - это способ отделить алгоритм от структуры объекта, с которой он работает. Это официальное определение этого. Я пытаюсь понять, как это не нарушает инкапсуляцию. Например, если у меня есть разные типы классов для разных типов банковских счетов [Saving / Fixed / Current], реализующих абстрактный класс Account, я должен поместить метод расчета процентов в качестве абстрактного метода в абстрактный класс Account или отправить учетную запись набрать в реализации посетителя и рассчитать там?
Метод 1: Должна ли реализация Посетителя нести ответственность за начисление процентов за разные типы счетов?
public interface IInterestVisitor
{
void GetInterest(Savings AccountType);
void GetInterest(Fixed AccountType);
void GetInterest(Current AccountType);
}
Метод 2: Или это должны сделать разработчики класса Account?
public abstract class Account
{
public abstract void AcceptCalculateInterestVisitor(IInterestVisitor iv);
public abstract int CalculateInterestAmount();
}
Если я использую метод 1, который является реализацией посетителя, которая реализует IInterestVisitor, как указано выше, то задача расчета процентов будет делегирована классу посетителя. Используя этот подход, если я добавлю другой тип учетной записи, то мне придется изменять реализацию посетителя каждый раз, когда появляется новая учетная запись.
Однако, если я оставлю бит начисления процентов на реализацию абстрактных классов Account, как описано выше в методе 2, то, по моему мнению, [ исправьте меня, если я ошибаюсь ] Я не нарушаю инкапсуляцию. Кроме того, требуется меньше кода для модификации, так как все, что я делаю, это добавляю новый класс и заставляю посетителя реализовать интерфейс, подобный показанному ниже
public interface IInterestVisitor
{
void GetInterest(Account AccountType);
}
public class InterestVisitor : IInterestVisitor
{
public void GetInterest(Account AccountType)
{
int i = AccountType.CalculateInterestAmount();
Console.WriteLine(i);
}
}
Как видите, для класса заинтересованных посетителей, использующего метод 2, не требуется никаких модификаций. Не нарушает ли метод 1 инкапсуляцию? Может ли метод 2 все еще называться шаблоном посетителя?
Спасибо за чтение ...