Hallo,
wie ihr ja sicherlich schon gemerkt habe, bin ich bezüglich Design-Patterns nicht so ganz fit. Gerade probiere ich mich am Strategy-Pattern aus. Mal angenommen ich habe eine Klasse die vielerlei Eigenschaften hat und allerhand kann. Um mal das klassische Autobeispiel zu strapazieren:
class Auto
{
private:
Gaspedal gaspedal;
Klimaanlage klimaanlage;
Radio radio;
Lenkrad lenkrad;
Handschuhfach handschuhfach;
Gangschaltung gangschaltung;
Sitz fahrersitz;
Sitz beifahrersitz;
Gurt fahrergurt;
Gurt beifahrergurt;
};
So, nun benutze ich das Strategy-Pattern, um diese Dinge zu benutzen:
class Auto
{
private:
Gaspedal gaspedal;
Klimaanlage klimaanlage;
Radio radio;
Lenkrad lenkrad;
Handschuhfach handschuhfach;
Gangschaltung gangschaltung;
Sitz fahrersitz;
Sitz beifahrersitz;
Gurt fahrergurt;
Gurt beifahrergurt;
Fahrer *fahrer;
Beifahrer *beifahrer;
public:
void einsteigen(Fahrer *f) {fahrer = f;}
void einsteigen(Beifahrer *f) {beifahrer = b;}
void fahre_zu_ziel(Ziel ziel)
{
fahrer->fahre(ziel, this);
beifahrer->mitfahren(this);
}
};
class Fahrer
{
public:
virtual void fahre(Ziel, Auto*)=0;
};
class Sonntagsfahrer: public Fahrer
{
virtual void fahre(Ziel ziel ,Auto *auto)
{
// Braucht gaspedal, klimaanlage, radio, lenkrad, handschuhfach, gangschaltung, fahrersitz, fahrergurt
}
};
class Beifahrer
{
public:
virtual void mitfahren(Auto*)=0;
};
class Quaengelige_Schwiegermutter: public Beifahrer
{
virtual void mitfahren(Auto *auto)
{
// Braucht klimaanlage, radio, handschuhfach, beifahrersitz, beifahrergurt
}
};
Und jetzt habe ich ein Problem mit der Kapselung: Und zwar brauchen die ganzen konkreten Strategien allerlei Zugriff auf die Eigenschaften der Klasse. Wie macht man das üblicherweise?
Ich übergebe alles per Parameter, wie es gedacht ist. Nachteil: Elendig lange Liste, wartungsaufwändig.
Ich schreibe Wrappermethoden in der Klasse Auto, welche die Methoden der Member weitergeben. Z.B.:
void Auto::schalte_hoch() {++gangschaltung;}
Nachteil: Sehr wartungsaufwändig. Außerdem: Verlust der Kapselung. class Fußgänger braucht keinen Zugriff auf die Gangschaltung eines vorbeifahrenden Autos
Ich mache alles public. Vorteil: Weniger Wartung. Nachteil: Siehe oben
Ich mache Auto oder Gangschaltung friend zu den Strategien. Vorteil: Kapselung wird nur so weit wie nötig verletzt. Nachteil: Trotzdem ganz schön viel Kapselung verloren. Fahrer könnten theoretisch in anderen Autos die Gänge wechseln. Außerdem sehr wartungsaufwändig, weil friendship nicht vererbt wird
Irgendwie habe ich das Gefühl, dass ich hier irgendwas ganz primitives übersehen habe oder dass ich irgendwas an der Methode nicht richtig verstanden habe.