bg_image
header

Prototyp

Ein Prototype (Prototyp) ist ein Entwurfsmuster in der Softwareentwicklung, das zur Kategorie der Erzeugungsmuster (Creational Patterns) gehört. Das Prototype-Muster wird verwendet, um die Erzeugung neuer Objekte zu optimieren, indem es eine Instanz eines bestehenden Objekts (den sogenannten Prototypen) als Vorlage verwendet und neue Kopien dieses Prototyps erstellt. Dies ermöglicht die Erstellung von Objekten, die einer vorhandenen Instanz ähnlich sind, ohne die Details der Objekterzeugung zu kennen.

Hier sind einige wichtige Konzepte und Eigenschaften des Prototype-Musters:

  1. Prototyp-Instanz: Das Muster beginnt mit einer vorhandenen Prototyp-Instanz, die als Vorlage für die Erstellung neuer Objekte dient.

  2. Kopieren des Prototyps: Neue Objekte werden erstellt, indem der Prototyp kopiert wird. Dies kann eine flache Kopie sein, bei der nur die primären Daten kopiert werden, oder eine tiefe Kopie, bei der auch referenzierte Objekte kopiert werden.

  3. Unabhängigkeit von Klassen: Das Prototype-Muster ermöglicht die Erstellung von Objekten, ohne auf die genaue Klasse des Prototyps achten zu müssen. Es arbeitet auf der Basis des Kopierens von Objekten und ist daher unabhängig von den spezifischen Klassen.

  4. Klonen von Objekten: Das Muster verwendet oft die Methode "Clone" oder ein ähnliches Verfahren, um Kopien des Prototyps zu erstellen.

  5. Anwendungsfälle: Das Prototype-Muster ist besonders nützlich, wenn die Erstellung eines Objekts teuer ist, wie z. B. bei der Datenbankverbindungsherstellung oder der Ladezeit großer Ressourcen. Es kann auch verwendet werden, um Objekte zu erstellen, deren Konstruktion komplex ist und viele Konfigurationsoptionen erfordert.

Das Prototype-Muster bietet den Vorteil, die Erstellung von Objekten effizienter zu gestalten, insbesondere wenn viele ähnliche Objekte benötigt werden. Es ermöglicht die einfache Anpassung von Prototypen, um verschiedene Varianten eines Objekts zu erstellen, ohne den Erstellungsprozess jedes Mal neu durchlaufen zu müssen. Dies trägt zur Verbesserung der Leistung und Effizienz von Softwareanwendungen bei.


Builder

Im Kontext der Softwareentwicklung ist ein Builder ein Entwurfsmuster, das zur Kategorie der Erzeugungsmuster (Creational Patterns) gehört. Der Builder wird verwendet, um die Konstruktion eines komplexen Objekts zu abstrahieren und zu vereinfachen, indem er einen schrittweisen Ansatz zur Erstellung des Objekts ermöglicht. Dieses Muster ist nützlich, wenn Sie Objekte mit vielen optionalen Parametern erstellen müssen oder wenn Sie die Erstellung eines Objekts von seiner Darstellung trennen möchten.

Hier sind einige wichtige Konzepte und Eigenschaften eines Builders im Kontext der Softwareentwicklung:

  1. Abstraktion der Konstruktion: Der Builder abstrahiert die Erstellung eines komplexen Objekts, sodass der Clientcode sich nicht um die Details der Konstruktion kümmern muss.

  2. Schrittweiser Ansatz: Die Konstruktion des Objekts erfolgt schrittweise. Der Builder definiert eine Reihe von Methoden oder Schritten, die nacheinander ausgeführt werden, um das Objekt zu erstellen. Dies ermöglicht die schrittweise Konfiguration des Objekts.

  3. Trennung von Darstellung und Konstruktion: Der Builder trennt die Darstellung des Objekts von seiner Konstruktion. Dies bedeutet, dass das Objekt während des Erstellungsprozesses in einem internen Zustand aufgebaut wird, der von seiner endgültigen Darstellung abweichen kann.

  4. Konfigurierbare Optionen: Ein Builder kann Methoden oder Parameter bieten, um verschiedene Konfigurationsoptionen festzulegen. Dies ist besonders nützlich, wenn ein Objekt viele optionale Eigenschaften oder Parameter hat.

  5. Rückgabewert: Der Builder gibt normalerweise das fertige Objekt zurück, wenn der Erstellungsprozess abgeschlossen ist.

  6. Immutabilität: Oft sind die erstellten Objekte nach dem Erstellen unveränderlich (immutable), was bedeutet, dass sie nicht mehr geändert werden können.

Ein gutes Beispiel für die Verwendung eines Builders ist die Erstellung von komplexen Datenstrukturen, wie beispielsweise JSON-Objekten oder HTML-Dokumenten. Ein Builder ermöglicht es, diese Strukturen schrittweise aufzubauen und verschiedene Konfigurationsoptionen festzulegen, ohne den Clientcode zu überladen.

Die Verwendung eines Builders kann die Lesbarkeit und Wartbarkeit des Codes verbessern, insbesondere wenn die Erstellung von komplexen Objekten beteiligt ist. Es ermöglicht auch eine klare Trennung zwischen der Konstruktion und der Verwendung von Objekten, was die Flexibilität und Erweiterbarkeit des Codes fördert.


Singleton

Ein Singleton ist ein Entwurfsmuster in der Softwareentwicklung, das zur Kategorie der Erzeugungsmuster (Creational Patterns) gehört. Das Singleton-Muster sorgt dafür, dass eine Klasse nur eine einzige Instanz hat und stellt einen globalen Zugriffspunkt auf diese Instanz bereit. Mit anderen Worten, es garantiert, dass es nur eine einzige Instanz einer bestimmten Klasse gibt und ermöglicht es, auf diese Instanz von überall in der Anwendung zuzugreifen.

Hier sind einige wichtige Eigenschaften und Konzepte des Singleton-Musters:

  1. Einzelne Instanz: Das Singleton-Muster stellt sicher, dass es nur eine einzige Instanz der Klasse gibt, unabhängig davon, wie oft und von welchen Teilen des Codes auf sie zugegriffen wird.

  2. Globaler Zugriffspunkt: Es bietet einen globalen Zugriffspunkt (oft in Form einer statischen Methode oder eines statischen Mitglieds) zum Abrufen der einzigen Instanz der Klasse.

  3. Konstruktorbeschränkung: Der Konstruktor der Singleton-Klasse ist in der Regel privat oder geschützt, um zu verhindern, dass neue Instanzen auf herkömmliche Weise erstellt werden können.

  4. Lazy Initialization: Die Instanz des Singletons wird oft erst dann erstellt, wenn sie zum ersten Mal angefordert wird, um Ressourcen zu sparen und die Leistung zu verbessern. Dies wird als "Lazy Initialization" bezeichnet.

  5. Thread-Sicherheit: In Mehrbenutzerumgebungen ist es wichtig sicherzustellen, dass das Singleton-Objekt thread-sicher ist, um gleichzeitigen Zugriff durch mehrere Threads zu verhindern. Dies kann durch Synchronisierung oder andere Mechanismen erreicht werden.

  6. Anwendungsfälle: Singleton wird oft verwendet, wenn eine einzige Instanz einer Klasse im gesamten Anwendungskontext benötigt wird, beispielsweise für eine Logger-Klasse, eine Datenbankverbindungspooling-Klasse oder eine Einstellungsmanager-Klasse.

Das Singleton-Muster bietet eine zentrale Instanz, die Informationen oder Ressourcen gemeinsam nutzen kann und gleichzeitig sicherstellt, dass keine übermäßige Instanziierung erfolgt, was in bestimmten Situationen wünschenswert ist. Es sollte jedoch vorsichtig verwendet werden, da eine zu häufige Verwendung von Singleton dazu führen kann, dass der Code schwer zu testen und zu warten ist. Es ist wichtig sicherzustellen, dass das Singleton-Muster in den jeweiligen Anwendungsfällen angemessen ist und sorgfältig implementiert wird.


Factory Methode

In der Softwareentwicklung ist die Factory-Methode (Factory Method) ein Entwurfsmuster aus der Kategorie der Erzeugungsmuster (Creational Patterns). Das Hauptziel der Factory-Methode besteht darin, die Erzeugung von Objekten zu kapseln und zu abstrahieren, indem sie eine Schnittstelle für die Erstellung von Objekten definiert, aber die genaue Art und Weise, wie diese Objekte erstellt werden, den abgeleiteten Klassen überlässt.

Hier sind einige wichtige Konzepte und Eigenschaften der Factory-Methode:

  1. Abstrakte Schnittstelle: In der Factory-Methode wird eine abstrakte Schnittstelle oder eine abstrakte Basisklasse definiert, die eine Methode zum Erzeugen von Objekten deklariert. Diese Methode wird als "Factory-Methode" bezeichnet.

  2. Konkrete Implementierungen: Die konkreten Unterklassen (Subklassen) implementieren die Factory-Methode, um spezifische Objekte zu erstellen, die ihren Anforderungen entsprechen. Jede Unterklasse kann unterschiedliche Implementierungen der Factory-Methode bereitstellen.

  3. Entkopplung von Erzeugung und Verwendung: Die Factory-Methode trennt die Erzeugung von Objekten von ihrer Verwendung. Dies ermöglicht eine lose Kopplung zwischen dem Code, der die Objekte verwendet, und dem Code, der sie erstellt.

  4. Erweiterbarkeit: Da neue Unterklassen erstellt werden können, um die Factory-Methode zu implementieren, ist dieses Muster erweiterbar. Neue Objekttypen können hinzugefügt werden, ohne den bestehenden Code zu ändern.

  5. Anwendungsfälle: Die Factory-Methode wird häufig verwendet, wenn eine Klasse in der Lage sein muss, Objekte eines bestimmten Typs zu erstellen, aber der genaue Typ zur Laufzeit festgelegt werden soll. Dies ist besonders nützlich in Szenarien, in denen Objekte dynamisch erstellt werden müssen, basierend auf Benutzeranforderungen oder Konfigurationsparametern.

Ein häufiges Beispiel für die Verwendung der Factory-Methode ist die Erstellung von Produkten in einem Produktionsprozess. Jede Produktart kann eine eigene Fabrikmethode haben, die auf die spezifischen Anforderungen und Prozesse für die Erstellung dieses Produkts abgestimmt ist.

In der Softwareentwicklung können Factory-Methoden dazu beitragen, den Code flexibler und erweiterbarer zu gestalten, indem sie die Verantwortung für die Erzeugung von Objekten in den richtigen Kontext legen und eine klare Schnittstelle für die Erstellung bereitstellen. Dies trägt zur Verbesserung der Modularität und Wartbarkeit von Softwareprojekten bei.


State

"State" ist ein Entwurfsmuster in der Softwareentwicklung, das zur Kategorie der Verhaltensmuster gehört. Es ermöglicht einem Objekt, sein Verhalten zu ändern, wenn sich sein interner Zustand ändert, sodass es so erscheint, als ob es seine Klasse gewechselt hätte.

Das State-Muster wird verwendet, um situationsabhängiges Verhalten zu implementieren, bei dem das Verhalten eines Objekts von seinem internen Zustand abhängt. Es hilft, große und komplexe Zustandsmaschinen zu vermeiden, indem es den Zustand und die entsprechende Verhaltenslogik in separate Klassen auslagert.

Die grundlegenden Komponenten des State-Musters sind:

  1. Context: Dies ist das Kontextobjekt, das den aktuellen Zustand darstellt. Es enthält eine Referenz auf das aktuelle Zustandsobjekt und delegiert die Anfragen an das Zustandsobjekt, um die Aktionen auszuführen. Der Context kann auch Methoden bereitstellen, um den Zustand zu ändern.

  2. State: Dies ist das abstrakte Interface, das die Methoden definiert, die das Verhalten für verschiedene Zustände beschreiben. Jede konkrete Zustandsklasse implementiert dieses Interface und behandelt die Anfragen entsprechend ihrem Zustand.

  3. ConcreteState: Dies sind die konkreten Implementierungen des State-Interfaces, die das Verhalten für spezifische Zustände definieren. Jeder Zustand übernimmt die Kontrolle über das Verhalten, wenn das Context-Objekt in diesem Zustand ist.

Das State-Muster ermöglicht es einem Objekt, sein Verhalten zu ändern, indem es zwischen verschiedenen Zuständen wechselt. Wenn das Objekt in einen neuen Zustand wechselt, wechselt es effektiv zu einer anderen Implementierung des Verhaltens, ohne dass die Client-Klasse oder das Context-Objekt dies wissen oder betroffen sein müssen.

Das State-Muster wird oft in Situationen eingesetzt, in denen sich das Verhalten eines Objekts je nach Kontext oder Zustand ändert, wie zum Beispiel in Zustandsautomaten, Benutzeroberflächensteuerungen oder anderen Anwendungsfällen, bei denen der Zustand eines Objekts das mögliche Verhalten beeinflusst. Es fördert eine saubere und flexible Code-Organisation, da Zustände leicht hinzugefügt oder geändert werden können, ohne dass die betroffenen Klassen wesentlich geändert werden müssen.


Iterator

Der Iterator ist ein Entwurfsmuster in der Softwareentwicklung, das zur Kategorie der Verhaltensmuster gehört. Es ermöglicht den sequentiellen Zugriff auf die Elemente einer Sammlung, ohne die zugrunde liegende Implementierung der Sammlung offenlegen zu müssen. Das heißt, es bietet eine einheitliche Schnittstelle, um über die Elemente einer Sammlung zu iterieren, unabhängig von der Art der Sammlung (z. B. Liste, Array, Baumstruktur usw.).

Das Iterator-Muster ist besonders nützlich, wenn Sie durch Elemente einer Sammlung iterieren müssen, aber nicht wissen möchten, wie die Sammlung intern organisiert ist. Es ermöglicht auch das gleichzeitige Durchlaufen derselben Sammlung durch mehrere Iteratoren, ohne dass sich die Iteratoren gegenseitig beeinflussen.

Die grundlegenden Komponenten des Iterator-Musters sind:

  1. Iterator: Dies ist das abstrakte Interface, das die Methoden definiert, die für die Iteration durch die Sammlung verwendet werden. Dazu gehören Methoden wie getNext(), hasNext(), reset() usw.

  2. ConcreteIterator: Dies ist die konkrete Implementierung des Iterators, die die Methoden des abstrakten Iterator-Interfaces implementiert und den tatsächlichen Iterationsmechanismus bereitstellt. Es speichert normalerweise einen Zeiger oder eine Position in der Sammlung, um den aktuellen Standort des Iterators zu verfolgen.

  3. Aggregate: Dies ist das abstrakte Interface, das die Methoden definiert, um die Sammlung zu erstellen und Iteratoren zu erstellen. Typischerweise enthält es eine Methode wie createIterator().

  4. ConcreteAggregate: Dies ist die konkrete Implementierung der Sammlung, die das Aggregate-Interface implementiert. Es stellt die tatsächliche Sammlung von Elementen bereit und gibt einen passenden Iterator zurück, wenn createIterator() aufgerufen wird.

Das Iterator-Muster ermöglicht es Ihnen, den Code, der die Sammlung durchläuft, von der Implementierung der Sammlung selbst zu trennen. Es erhöht die Flexibilität und Erweiterbarkeit des Codes, da Sie verschiedene Iteratoren implementieren können, um die gleiche Sammlung auf unterschiedliche Weise zu durchlaufen, ohne die Sammlung selbst zu ändern.

In vielen modernen Programmiersprachen und Frameworks sind Iteratoren bereits integriert, und Sie können die Iteration durch Sammlungen mithilfe von Iterator-Mustern problemlos implementieren und nutzen.


Chain of Responsibility

Die "Chain of Responsibility" (Kette der Verantwortung) ist ein Entwurfsmuster aus der Softwareentwicklung, das zur Kategorie der Verhaltensmuster gehört. Es ermöglicht die Kapselung von Anfragen, Befehlen oder Aktionen und ermöglicht es mehreren Objekten, die Möglichkeit zu haben, eine Anfrage sequentiell zu bearbeiten, bis ein Objekt in der Kette die Verantwortung für die Bearbeitung übernimmt.

Das Muster wird häufig verwendet, um eine lose Kopplung zwischen Sender und Empfänger einer Anfrage zu erreichen. Statt dass der Absender einer Anfrage genau weiß, welches Objekt die Anfrage verarbeiten wird, wird die Anfrage durch eine Kette von Objekten weitergereicht, bis ein geeignetes Objekt gefunden wird, das die Anfrage verarbeiten kann.

Hier ist eine vereinfachte Beschreibung des Musters:

  1. Es gibt eine abstrakte Klasse oder ein Interface, das die gemeinsame Schnittstelle für alle Objekte in der Kette definiert. Es enthält normalerweise eine Methode, die die Anfrage behandelt, und eine Referenz auf das nächste Objekt in der Kette.

  2. Konkrete Implementierungen dieser abstrakten Klasse oder des Interfaces bilden die einzelnen Glieder der Kette. Jedes Glied entscheidet, ob es die Anfrage bearbeitet oder an das nächste Glied weiterleitet.

  3. Die Glieder werden in einer sequentiellen Kette verbunden, wobei jedes Glied auf das nächste verweist.

  4. Wenn eine Anfrage eintrifft, wird sie an das erste Glied der Kette geschickt. Das erste Glied entscheidet, ob es die Anfrage bearbeiten kann oder nicht. Wenn ja, wird die Anfrage bearbeitet und der Vorgang ist abgeschlossen. Wenn nicht, wird die Anfrage an das nächste Glied in der Kette weitergeleitet, und dieser Prozess setzt sich fort, bis die Anfrage bearbeitet wird oder die Kette zu Ende ist.

Das Chain-of-Responsibility-Muster ist besonders nützlich, wenn es mehrere Objekte gibt, die eine Anfrage in verschiedenen Schritten oder auf unterschiedliche Weise verarbeiten können. Es ermöglicht eine flexible und erweiterbare Struktur, in der Sie einfach neue Glieder hinzufügen oder die Reihenfolge ändern können, ohne den Code des Absenders zu ändern.

Dieses Muster wird in vielen Bereichen der Softwareentwicklung eingesetzt, darunter in GUI-Event-Handling, Middleware-Frameworks, Fehlerbehandlung und vielem mehr.


Template Method Pattern

Das Template Method Pattern ist ein Entwurfsmuster (Design Pattern) aus der Softwareentwicklung, das zur Kategorie der Verhaltensmuster gehört. Es ermöglicht die Definition des grundlegenden Ablaufs eines Algorithmus in einer abstrakten Klasse, während die Details der einzelnen Schritte in den abgeleiteten Klassen implementiert werden können.

Das Template Method Pattern besteht aus den folgenden Hauptkomponenten:

  1. AbstractClass: Die abstrakte Klasse definiert eine Vorlage für den Algorithmus und enthält eine oder mehrere abstrakte Methoden, die von den abgeleiteten Klassen implementiert werden müssen. Diese abstrakten Methoden repräsentieren die spezifischen Schritte des Algorithmus, die in den abgeleiteten Klassen variieren können. Die abstrakte Klasse enthält auch eine Template-Methode, die den grundlegenden Ablauf des Algorithmus definiert und auf die abstrakten Methoden zugreift, um den Algorithmus zu vervollständigen.

  2. ConcreteClass: Dies sind die konkreten Implementierungen der abstrakten Klasse. Jede konkrete Klasse implementiert die abstrakten Methoden der abstrakten Klasse, um die spezifischen Details des Algorithmus festzulegen. Die konkrete Klasse kann auch zusätzliche Methoden oder Eigenschaften enthalten, die für den Algorithmus spezifisch sind.

Der Ablauf ist folgendermaßen: Die abstrakte Klasse enthält die Template-Methode, die den Algorithmus definiert. Diese Template-Methode ruft intern die abstrakten Methoden auf, um die spezifischen Schritte des Algorithmus auszuführen. Die abstrakten Methoden werden von den konkreten Klassen implementiert, die von der abstrakten Klasse erben. Jede konkrete Klasse bietet somit ihre eigene Implementierung für die abstrakten Methoden und gestaltet damit den Algorithmus entsprechend um.

Das Template Method Pattern fördert die Wiederverwendung von Code, da der grundlegende Algorithmus in der abstrakten Klasse definiert ist und nicht in jeder konkreten Klasse dupliziert werden muss. Es ermöglicht auch die Variation einzelner Schritte eines Algorithmus, indem es den konkreten Klassen erlaubt, spezifische Implementierungen für die abstrakten Methoden bereitzustellen. Dadurch bleibt der Algorithmus flexibel und erweiterbar, ohne den Gesamtablauf zu verändern.


Command Pattern

Das Command Pattern ist ein Entwurfsmuster (Design Pattern) aus der Softwareentwicklung, das zur Kategorie der Verhaltensmuster gehört. Es zielt darauf ab, Operationen oder Anfragen zu kapseln, indem es sie in eigenständige Objekte umwandelt. Dadurch können Anfragen parameterisiert und in Form von Objekten übergeben, in einer Warteschlange gespeichert, protokolliert oder rückgängig gemacht werden.

Die Hauptkomponenten des Command Patterns sind:

  1. Command: Das Command-Interface definiert eine Methode (oder mehrere Methoden), die von den konkreten Befehlsklassen implementiert werden müssen. Typischerweise enthält es eine Methode wie execute(), die die Aktion ausführt, die der Befehl darstellt.

  2. ConcreteCommand: Dies sind die konkreten Implementierungen des Command-Interfaces. Jede konkrete Befehlsklasse implementiert die execute()-Methode und enthält eine Referenz auf den Empfänger, der die eigentliche Aktion ausführt.

  3. Invoker: Der Invoker ist für das Ausführen der Befehle verantwortlich. Er hält eine Referenz auf das Command-Objekt und ruft dessen execute()-Methode auf, wenn die Anfrage ausgeführt werden soll.

  4. Receiver: Der Empfänger ist die Klasse, die die tatsächliche Aktion ausführt, wenn der Befehl execute() aufgerufen wird. Es enthält die Logik, um die spezifische Anfrage zu verarbeiten.

Der Ablauf ist folgendermaßen: Der Client erstellt ein Command-Objekt und weist ihm einen konkreten Befehl (ConcreteCommand) zu, der eine bestimmte Aktion auf einem bestimmten Empfänger (Receiver) ausführt. Das Command-Objekt wird dann dem Invoker übergeben. Der Invoker ruft die execute()-Methode auf dem Command-Objekt auf, und dieses führt die entsprechende Aktion über den Empfänger aus.

Das Command Pattern ist besonders nützlich, wenn Anfragen oder Operationen in einer Anwendung rückgängig gemacht werden müssen oder wenn sie als eigenständige Objekte behandelt werden sollen, um sie zu parametrisieren oder in einer Warteschlange zu verwalten. Es fördert auch die Trennung von Befehl und Ausführung und kann die Flexibilität und Erweiterbarkeit des Codes verbessern.


Strategy Pattern

Das Strategy Pattern ist ein Entwurfsmuster (Design Pattern) aus der Softwareentwicklung, das zur Kategorie der Verhaltensmuster gehört. Es wird verwendet, um eine Familie von Algorithmen oder Verhaltensweisen zu definieren, diese untereinander austauschbar zu machen und von der Implementierung zu entkoppeln.

Das Ziel des Strategy Patterns ist es, den verschiedenen Varianten eines Algorithmus oder einer Verhaltensweise eine einheitliche Schnittstelle zu geben, so dass sie unabhängig voneinander ausgetauscht werden können, ohne dass Änderungen an der verwendenden Klasse erforderlich sind. Dies ermöglicht eine größere Flexibilität und Erweiterbarkeit des Codes.

Die Hauptkomponenten des Strategy Patterns sind:

  1. Context: Der Kontext ist die Klasse, die die verschiedenen Strategien verwendet. Er hält eine Referenz auf das aktuell ausgewählte Strategieobjekt.

  2. Strategy: Die Strategy ist das abstrakte Interface oder die abstrakte Klasse, das die verschiedenen Algorithmusvarianten definiert. Es definiert die Methode(n), die von den konkreten Strategien implementiert werden müssen.

  3. ConcreteStrategy: Dies sind die konkreten Implementierungen der Strategy-Schnittstelle. Jede Implementierung stellt einen spezifischen Algorithmus oder eine spezifische Verhaltensweise dar.

Der Ablauf ist folgendermaßen: Der Kontext verwendet eine der konkreten Strategien, um eine bestimmte Operation auszuführen. Wenn sich die Anforderungen ändern oder ein anderer Algorithmus verwendet werden soll, kann der Kontext die Strategie dynamisch wechseln, indem er eine andere konkrete Strategie auswählt.

Das Strategy Pattern wird häufig eingesetzt, wenn es mehrere Varianten eines Algorithmus oder einer Verhaltensweise gibt, die in einer Anwendung verwendet werden können, und wenn eine hohe Flexibilität und Austauschbarkeit zwischen diesen Varianten erforderlich ist. Es hilft auch, den Code sauberer und besser wartbar zu gestalten, da die verschiedenen Strategien separat entwickelt und getestet werden können, ohne die Kontextklasse zu beeinflussen.