Контекст
Я використовував з ієрархією об'єктів (дерево виразів) "псевдо" шаблон відвідувача (псевдо, так як в ньому не використовується подвійна відправка):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
Цей дизайн був, однак, сумнівним, досить зручним, оскільки кількість реалізацій MyInterface є значним (~ 50 і більше), і мені не потрібно було додавати додаткові операції.
Кожна реалізація є унікальною (це інший вираз чи оператор), а деякі - композити (тобто вузли операторів, які містять інші вузли оператора / аркуша).
В даний час обхід виконується за допомогою виклику операції Accept на кореневому вузлі дерева, який по черзі викликає Accept на кожному з його дочірніх вузлів, що в свою чергу ... і так далі ...
Але настав час, коли мені потрібно додати нову операцію , таку як гарне друк:
public class MyImpl : MyInterface
{
// Property does not come from MyInterface
public string SomeProperty { get; set; }
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
public void Accept(SomePrettyPrinter printer)
{
printer.PrettyPrint(this.SomeProperty);
}
}
Я в основному бачу два варіанти:
- Дотримуйтесь тієї ж конструкції, додаючи новий метод для моєї роботи до кожного похідного класу за рахунок ремонтопридатності (не варіант, IMHO)
- Використовуйте "справжній" шаблон відвідувачів за рахунок розширюваності (не варіант, так як я очікую, що більше шляху буде впроваджено на шляху ...) з приблизно 50+ перевантаженнями методу відвідування, кожна з яких відповідає конкретній реалізації ?
Питання
Чи рекомендуєте ви використовувати шаблон відвідувача? Чи є якась інша закономірність, яка могла б допомогти вирішити це питання?
MyInterface
.. чи всі ці класи мають унікальну реалізацію DoSomething
і DoSomethingElse
? Я не бачу, де насправді ваш клас відвідувачів переходить ієрархію - це схоже facade
на даний момент ..