Bei der Arbeit entwickeln wir eine PHP-Anwendung, die später in Java neu programmiert werden würde. Mit einigen Grundkenntnissen von Java versuchen wir, alles so zu gestalten, dass es ohne Probleme neu geschrieben werden kann. Ein interessantes Problem trat auf, als wir versuchten, composite pattern mit einer großen Anzahl von Methoden in Leafs zu implementieren.Multiple-Leaf-Methoden Problem in Composite-Muster
Was wir erreichen wollen (nicht mit Hilfe von Schnittstellen, es ist nur ein kleines Beispiel):
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();
Es ist wie so ziemlich klassisches Composite-Muster scheint, aber Problem ist, dass wir sehr viele Blatt Klassen haben und jeder von ihnen könnte ~ 5 Methoden haben (von denen wenige anders als andere sein könnten). Eine unserer Lösungen, die bisher die beste zu sein scheint und möglicherweise funktioniert, verwendet __call magic method, um Methoden in Blättern aufzurufen. Leider wissen wir nicht, ob es in Java ein Äquivalent dazu gibt.
Die eigentliche Frage ist also: Gibt es eine bessere Lösung dafür, Code zu verwenden, der schließlich leicht in Java umcodiert werden könnte? Oder empfehlen Sie eine andere Lösung? Vielleicht gibt es ein anderes, besseres Muster, das ich hier verwenden könnte.
Falls etwas unklar ist, einfach fragen und ich werde diesen Beitrag bearbeiten.
Edit:
tatsächliches Problem ist, dass nicht jedes Blatt Klasse enthält zum Beispiel Verfahren Baz. Wenn wir einfach foreach verwenden würden, um Baz in jeder Klasse aufzurufen, würde es viele Fehler geben, da es bestimmte Klassen gibt, die diese Methode nicht enthalten. Klassische Lösung wäre, jede einzelne Methode aus jeder einzelnen Blattklasse in die Klasse Composite zu implementieren, jede mit einer anderen Implementierung. Aber das würde unsere zusammengesetzte Klasse enorm und chaotisch machen mit der Menge an Methoden, die wir verwenden.
So übliche Lösung würde so aussehen (Composite-Klasse):
class Composite implements Fooable, Bazable {
...
public function Foo() {
foreach($this->classes as $class) {
$class->Foo();
}
}
public function Baz() {
...
}
}
unseren Code verhindern echtes Chaos zu werden, wir denken über etwas wie:
class Composite {
...
public function __call() {
// implementation
}
}
Aber wir aren‘ t wirklich sicher, ob es eine gute Lösung ist und ob es auch in Java etwas Ähnliches gibt (wie schon vor dem Bearbeiten gefragt).
Bitte beschreiben Sie das Problem besser. Zusammengesetztes Muster ist für die Interaktion mit mehreren Objekten so, als wären sie eins oder dasselbe, unabhängig von der Struktur, die sie zusammensetzen. Was wollen Sie mit einem Verbundmuster erreichen? –
Ich wäre wirklich interessiert zu sehen, warum du es nicht von Anfang an in Java machst. –
@ Gabriel: Bearbeitet. Ich hoffe es hilft. @Ionut: Bürokratie :) –