На работе мы разрабатываем приложение PHP, которое впоследствии будет перепрограммировано на Java. Имея некоторые базовые знания Java, мы пытаемся спроектировать все так, чтобы его можно было легко переписать без каких-либо проблем. Интересная проблема возникла, когда мы попытались реализовать составной шаблон с огромным количеством методов в листах.
Чего мы пытаемся достичь (не используя интерфейсы, это всего лишь быстрый пример):
class Composite {
...
}
class LeafOne {
public function Foo( );
public function Moo( );
}
class LeafTwo {
public function Bar( );
public function Baz( );
}
$c = new Composite( Array( new LeafOne( ), new LeafTwo( ) ) );
// will call method Foo in all classes in composite that contain this method
$c->Foo( );
// same with Bar
$c->Bar( );
Кажется, что это довольно классический шаблон Composite, но проблема в том, что у нас будет довольно много листовых классов, и у каждого из них может быть ~ 5 методов (из которых немногие могут отличаться от других). Одно из наших решений, которое на данный момент является лучшим и может реально работать, - это использование __ call magic method для вызова методов в листьях.
К сожалению, мы не знаем, есть ли эквивалент в Java.
Таким образом, фактический вопрос: есть ли лучшее решение для этого, используя код, который в конечном итоге будет легко перекодирован в Java? Или вы рекомендуете другое решение? Возможно, есть какой-то другой, лучший образец, который я мог бы использовать здесь.
В случае, если что-то неясно, просто спросите, и я отредактирую этот пост.
Edit:
Фактическая проблема заключается в том, что не каждый листовой класс содержит, например, метод Baz. Если бы мы использовали простой foreach для вызова Baz в каждом классе, это дало бы кучу ошибок, поскольку есть определенные классы, которые не содержат этот метод. Классическим решением было бы внедрить каждый отдельный метод из каждого листового класса в класс Composite, каждый с разной реализацией. Но это сделало бы наш составной класс огромным и запутанным с количеством используемых нами методов.
Итак, обычное решение будет выглядеть так (класс Composite):
class Composite implements Fooable, Bazable {
...
public function Foo( ) {
foreach( $this->classes as $class ) {
$class->Foo( );
}
}
public function Baz( ) {
...
}
}
Чтобы наш код не стал настоящим беспорядком, мы думали о чем-то вроде:
class Composite {
...
public function __call( ) {
// implementation
}
}
Но мы не совсем уверены, является ли это хорошим решением и есть ли что-то подобное и в Java (как уже спрашивали перед редактированием).