Der wirkliche Geruch im Muster wie in Ihren Link und die meisten Bücher dargestellt ist, dass Component
die Methoden eines Composite
hat. Ich denke, das liegt wahrscheinlich daran, dass das Muster ziemlich alt ist und seit Jahren so wiederholt wird. Meine Annahme ist, dass nur die Composite
irgendwelche Methoden zum Compositing haben sollte.
Ich habe einmal ein Brettspiel in ein Computerspiel umgewandelt. Die Spielsteine wurden auf eine in Sechsecke aufgeteilte Erdkarte gelegt. 99% aller Sechsecke repräsentierten einen einzigen Ort. Leider enthielten einige der Sechsecke mehrere Orte, einige hatten zum Beispiel ein paar Inseln in ihnen. Ich habe das zusammengesetzte Muster verwendet, um diese Orte darzustellen, aber nicht wie auf Ihrem Link dargestellt. Es war so etwas wie dieses (in Java):
public interface Location {
Set<Army> getArmies();
}
public class SingleLocation implements Location {
public Set<Army> getArmies() {
return armies ;
}
private Set<Army> armies = new HashSet<Army>();
}
public class CompositeLocation implements Location {
public Set<Army> getArmies() {
Set<Army> armies = new HashSet<Army>();
for(Location subLocation: subLocations) {
armies.addAll(subLocation.getArmies());
}
return armies;
}
public void addSubLocation(Location location) {
subLocations.add(location);
}
private Set<Location> subLocations = new HashSet<Location>();
}
Beachten Sie, dass nur die Composite
Compositing Methoden hat, und setzen nicht einmal die Tatsache, dass es Kinder auf die meisten Kunden (in diesem Beispiel, nur der Kunde will eine Liste der Armeen von einem Ort aus - die Tatsache, dass sie sich an vielen Unterstandorten befinden, ist irrelevant.
Denken Sie daran, Design-Muster sind nicht in Stein gemeißelte Dinge, die Sie genau umsetzen müssen. Denken Sie an sie als Rezepte. Wenn du beim Kochen einem Rezept folgst, kannst du es sicher genau befolgen. Einige Köche werfen jedoch ihre eigenen Wendungen auf das Rezept. Andere werden es nicht einmal anschauen, weil sie Experten sind und etwas zusammen in den Geist des Rezepts werfen können, ohne darüber nachzudenken. Das Gleiche gilt für Designmuster. Sie sind formbare Rezepte.
Sie können diese SOLID-Prinzipien auch zu weit führen. Wenn Sie die Artikel von Robert Martin lesen, stellt er fest, dass die unkonventionelle Anwendung der Prinzipien übermäßig komplexen Code ergibt. Software wird durch eine Reihe von Trade-Offs und Balancings entwickelt - manchmal verzichten Sie auf reinen SOLID, weil er saubereren, weniger komplexen Code liefert. Wenn Sie Ihren Code perfekt gekapselt, flexibel, entkoppelt, usw. machen würden, hätten Sie eine neue Programmiersprache erfunden :-)
Ihre Frage ist unklar. Auch, was meinst du mit "SOLID" – monksy
Ich fügte eine SOLID-Verbindung für den Fragesteller, oben, hinzu. – SingleShot
SRP und LSP werden auch zusammen mit ISP verletzt. SOLID ist also gefährlich. :) – Narek