Entwurfsmuss-nicht-sein (Entwurfsmuster)[garantiert]

| Back to Overview

Einordnung

Also Entwurfsmuster, sind tatsächlich manchmal praktisch und helfen z.B. Sachen zu benenn oder guten Programmcode zu schreiben. Es gibt 1001 Muster, aber hier sind die, die wir in SWT hatten. Sie verwenden alle Vererbung in irgendeiner Form. Ja ich weiß alle sehen irgendwie gleich aus und machen ähnliches. Alle versuchen "Separation of concerns" zu erreichen.

Ein Aufgabenkomplex muss

Programmieren ohne Entwurfsmuster:

Programmieren mit Entwurfsmuster:

Hier eine Liste:

  • Adapter
  • Composite
  • Decorator
  • Factory
  • Observer
  • Singleton
  • CommandProcessor

Ich werde hier ein bissle genauer als den üblichen Bullshit erklären, da ihr schon entscheiden solltet, was jetzt das passende in der Situation ist.

Adapter (ist praktisch)

Der Adapter, verwendet eine Schnittstelle von dem Adaptee auf, und verändert diese gegebenenfalls. Somit wrappt der Adapter ein Adaptee (deswegen auch sehr sehr häufig Wrapper). Beispiel:

  • Adaptee: rechnet x+yx+y
  • Adapter: rechnet x+y+1x+y+1

Es wird aber auch dafür genutzt, um eine Schnittstelle zu verändern. Z.B. Adaptee braucht int's. Adapter nimmt Strings.

Den Adapter gibt es in 2 Formen:

  • Objektadapter: Target ist ein Interface oder Abstrakt und Adaptee ist ein Objekt im Adapter
  • Klassenadapter: Target ist eine Interface und Adaptee ist eine Klasse, von der Adapter erbt

Composite (verwendet man häufig ohne drüber nachzudenken )

Composites werden verwendet, um eine Hierarchie darzustellen. Man versteckt den unterschied, zwischen einzelnen (Leafs) und zusammengesetzten Objekten.

Bespiele sind:

  • UI Bibliotheken: Buttons, Textfelder sind Components, GridLayout (ein Behälter) ist aber auch ein Component, der andere Components enthält. (Ja genau genommen, tuen das Buttons auch egal...)

Factory (wird in vielen Frameworks verwendet)

Eine Factory erstellt eine Instanz von einem Objekt, aber anders als bei einem Konstruktor, können hier unterschiedlich Typen erstellt werden.

Beispiel:

  • SQLClientFactory in .NET Core (C#): So kann ein SQLClient erstellt werden, ohne zu wissen, welchem Typ von client man jetzt bekommt, da zwischen PostgreSQL und MYSQL doch schon Unterschiede gibt.

Decorator (joa)

Der Decorator ist ein Wrapper, der ein Objekt umschließt und es verändert. Er ist ähnlich wie der Adapter, aber der Adapter verändert die Schnittstelle, während der Decorator das Objekt verändert (Der Decorator erbt von der Abstrakten Klasse ruft dann aber sein base auf)

Pause

?Rumpe Zitate Quiz: Ist es ein Rumpe Zitat oder nicht?
""
*eventuell sind ein paar Zitate frei erfunden. Sendet mir mehr: jonas.max.schneider@gmail.com

Singleton

Ein Singleton ist eine Klasse, die nur einmal instanziiert werden (für die die nicht wissen was das ist: Es gibt es nur einmal als Objekt).

Wie wird das gemacht bsp. Java:

  
public class MySingleton {
  protected static MySingleton instance;

protected MySingleton() { }

private static MySingleton getInstance() {
if (instance == null) {
instance = new MySingleton();
}
return instance;
}

public static void someMethod() {
getInstance().\_someMethod();
}

protected void \_someMethod() {/* Do something */}
}

Durch das statische Objekt instance, wird sichergestellt, dass es nur einmal instanziiert wird. Falls es beim abrufen mit getInstance() noch nicht instanziiert wurde, wird es instanziiert.

Observer (braucht man überall unter anderem bei UI Kram)

Ein Observer ist ein Objekt, dass sich bei jeder Änderung eines anderen Objekts (Observable) benachrichtigen lässt.

Beispiel:

  • Daten liegen in irgendeiner Klasse, die ständig aktualisiert werden und die UI soll sich bei jeder Änderung aktualisieren.
  • rxjs: Hier wird der Zustand als Observable dargestellt und die UI kann sich dann als Observer dranhängen (simplifiziert).
  • Observables (In manchen Sprachen auch Event-Krams) sind meistens schön, da die alternative meistens Callbacks (aber ohne Vererbung), oder noch dümmer polling ist.

CommandProcessor

Commands sind halt Befehle/Anweisungen, die der Processor dann ausführt. Viel mehr ist nicht zusagen.

WAT NEM ICH DENN JETZT?

Es kann schon sein, dass du während der Klausur und im späterem Reichsein, gefragt wirst, wie du das Problem löst.

Hier ein paar Tipps:

  • Wenn du irgendwo drauf wartest, oder benachrichtigst werden sollst \Rightarrow Observer
  • Wenn du eine Schnittstelle hast, aber die nicht ganz zutrifft \Rightarrow Adapter
  • Wenn du eine Schnittstelle hast, aber die nicht ganz das machst, was du willst \Rightarrow Decorator
  • Wenn du irgendeine Hierarchie hast \Rightarrow Composite
  • Wenn du irgendeine Instanz haben willst, die nur einmal existiert \Rightarrow Singleton (Aller meistens Manager Klassen oder Datenbanken, etc)
  • Wenn du unterschiedliche Typen von Objekten erstellen willst \Rightarrow Factory

Insgesamt ist es häufig nicht ganz eindeutig welches jetzt das schlauste ist (sie sind ja auch kombinierbar), aber manches klappt halt besser als andere.