Al lavoro, stiamo sviluppando un'applicazione PHP che verrà successivamente riprogrammata in Java. Con alcune conoscenze di base di Java, stiamo cercando di progettare tutto per essere facilmente riscritto, senza grattacapi. Un problema interessante è emerso quando abbiamo cercato di implementare composite pattern con un numero enorme di metodi in foglie.Problema di metodi a foglie multiple nel modello composito
Cosa stiamo cercando di realizzare (se non utilizzano interfacce, è solo un esempio veloce):
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();
Sembra praticamente composite classico, ma il problema è che avremo abbastanza molte classi di foglie e ognuno di essi potrebbe avere ~ 5 metodi (di cui pochi potrebbero essere diversi dagli altri). Una delle nostre soluzioni, che sembra essere la migliore finora e potrebbe effettivamente funzionare, utilizza __call magic method per chiamare i metodi in foglie. Sfortunatamente, non sappiamo se esiste un equivalente in Java.
Quindi la vera domanda è: c'è una soluzione migliore per questo, utilizzando il codice che potrebbe essere facilmente ricodificato in Java? O raccomandi qualche altra soluzione? Forse c'è qualche schema diverso e migliore che potrei usare qui.
Nel caso ci sia qualcosa di poco chiaro, basta chiedere e io modificherò questo post.
Edit:
problema reale è che non ogni classe foglia contiene, ad esempio, il metodo Baz. Se avessimo usato foreach semplice per chiamare Baz in ogni classe, daremmo un sacco di errori, dato che ci sono certe classi che non contengono questo metodo. La soluzione classica sarebbe quella di avere ogni singolo metodo da ogni classe foglia implementato in classe Composite, ognuno con un'implementazione diversa. Ma questo renderebbe la nostra classe composita enorme e caotica con la quantità di metodi che usiamo.
Così solita soluzione sarebbe simile a questa (classe Composite):
class Composite implements Fooable, Bazable {
...
public function Foo() {
foreach($this->classes as $class) {
$class->Foo();
}
}
public function Baz() {
...
}
}
Per evitare che il nostro codice per diventare vero e proprio disastro, abbiamo pensato a qualcosa di simile:
class Composite {
...
public function __call() {
// implementation
}
}
Ma noi aren' Sono davvero sicuro che sia una buona soluzione e se c'è qualcosa di simile anche in Java (come richiesto già prima della modifica).
Si prega di descrivere meglio il problema. Il pattern composito serve per interagire con più oggetti come se fossero uno o uno stesso, indipendentemente dalla struttura che compongono. Cosa vuoi ottenere usando il pattern composito? –
Sarei davvero interessato a capire perché non lo stai facendo in Java dall'inizio. –
@Gabriel: Modificato. Spero che sia d'aiuto. @Ionut: Burocrazia :) –