class MyClass1
{
function accept(OperationGroup $operation) {$operation->visitMyClass1($this);}
function method1() {}
function method2() {}
}
abstract class OperationGroup {}
class OperationGroup1 extends OperationGroup
{
function visitMyClass1(MyClass1 $myClass1) {$myClass1->method1(); /*.............*/ }
function visitMyClass2(MyClass2 $myClass2) {$myClass2->method1(); /*.............*/ }
}
$myClass1 = new MyClass1();
$operationGroup1 = new OperationGroup1();
$myClass1->accept($operationGroup1);
Подскажите, пожалуйста, в чём суть шаблона проектирования Посетитель? Невзирая на все прочитанные статьи, всё равно непонятно. Методы visitMyClass1, visitMyClass2 и т.д. нужны, я так понимаю, для инкапсуляции работы с исходными классами MyClass1 и т.д., но зачем нужен метод accept в них?
Почему нельзя напрямую вызывать $operationGroup1->visitMyClass1($myClass1); ?