Strategiemodus der Delphi-Modus-Programmierung
Liu Yi
1.1 Erklärung des Modus
Der Zweck des Strategiemusters besteht darin, eine Reihe von Algorithmen zu definieren und jeden Algorithmus in eine unabhängige Klasse mit einer gemeinsamen Schnittstelle zu kapseln, damit sie untereinander ersetzt werden können. Das Strategiemuster ermöglicht Algorithmusänderungen unabhängig vom Client, der es verwendet. Um die Motivation und Bedeutung der Verwendung des Strategiemusters zu verstehen, müssen wir mit einem interessanten Beispiel beginnen. In einem Materialverwaltungssystem sind die Outbound- und Inbound-Module die Kernbestandteile des Systems (im Folgenden nehmen wir Outbound als Beispiel für die Analyse). Für Programmierer, die keine Erfahrung in der objektorientierten Programmierung haben, legen sie häufig die gesamte Logik der ausgehenden Bestellung auf dem Client ab (Outlet-Auftragsschnittstelle) und verwenden bedingte Verzweigungsanweisungen auf dem Client, um zu bestimmen, ob es sich bei der ausgehenden Bestellung um Kommissionierung handelt. B. Materialien ausleihen oder Verluste melden, um verschiedene ausgehende Abwicklungsmethoden zu wählen, wie in Abbildung 1-1 dargestellt. Dadurch wird der Code des Clients komplex und schwer zu warten. Beispiel: Wenn Sie einen neuen Transportauftragstyp aus dem Lager hinzufügen müssen, müssen Sie die Beurteilungsbedingungen ändern, den Client neu kompilieren und veröffentlichen. Da die Situation immer komplexer wird, wird es immer mehr bedingte Verzweigungen geben und immer mehr Programmcodes werden hinzugefügt. Dadurch wird der Client größer und schwieriger zu warten, und die Möglichkeit gegenseitiger Beeinflussung und Fehler nimmt zu . Abbildung 1-1 Das auf prozessorientiertem Denken basierende Ausgangsmodul kann bei der Analyse mit objektorientiertem Denken als abgeleitete Klassen der Ausgangsnotiz betrachtet werden, wie in Abbildung 1 dargestellt. 2 Anzeigen. Auf diese Weise dient das ausgehende Dokument als Dokumentbasisklasse, um eine gemeinsame Schnittstelle für Dokumente bereitzustellen, und Vererbung wird verwendet, um unterschiedliche ausgehende Verhaltensweisen in Unterklassen zu implementieren. Dabei wird tatsächlich ein wichtiges Konzept der Objektorientierung genutzt: Polymorphismus. Allerdings weist dieses Design noch einen Mangel auf, nämlich dass Umgebung und Verhalten eng miteinander verknüpft sind. Mit anderen Worten: Das Dokument und der spezifische Ausgangsalgorithmus sind eng miteinander verbunden. Eine starke Kopplung verhindert, dass sich beide unabhängig voneinander entwickeln, was die Wiederverwendbarkeit und Skalierbarkeit einschränkt. Abbildung 1-3 zeigt das ausgehende Modul, das mithilfe des Strategiemusters neu gestaltet wurde. Das ausgehende Dokumentobjekt verweist über ein ausgehendes Operationsobjekt (dh Kontext im Strategiemodus) auf das ausgehende Richtlinienobjekt. Verschiedene spezifische Outbound-Strategien werden durch abgeleitete Klassen der Outbound-Strategieklasse implementiert. Das ausgehende Dokument kann je nach ausgehendem Vorgang bzw. Dokumentstil eine ausgehende Abrechnungsmethode und eine Dokumentanzeigeschnittstelle bereitstellen. Auf diese Weise trennt der Strategiemodus das ausgehende Verhalten von der Umgebung des ausgehenden Dokuments, und die Erhöhung, Verringerung oder Änderung des ausgehenden Algorithmus hat keine Auswirkungen auf die Umgebung und den Client. Abbildung 1-2 Outbound-Modul, das auf objektorientiertem Denken basiert. Abbildung 1-3 Outbound-Modul, das auf Design-Pattern-Denken basiert. Der Vorteil des Strategiemusters liegt in der Trennung von Algorithmus und Umgebung, und beide können sich unabhängig voneinander entwickeln. Um die Vorteile der Trennung von Algorithmen und Umgebungen besser zu veranschaulichen, können wir uns auch den Entwurf in Abbildung 1-4 ansehen. In diesem Design gibt es kein Konzept für ausgehende und eingehende Module, da ich alle ausgehenden/eingehenden Dokumente abstrahiere und die Schnittstelle und das Verhalten der Dokumente während der Laufzeit dynamisch kombiniere. Über die Outbound/Inbound-Operationsklasse können verschiedene Verhaltensklassen verwaltet, abgefragt und konfiguriert werden. Das abstrahierte Ausgangs-/Eingangsverhalten kapselt seinen entsprechenden Algorithmus in Form einer Strategieklasse, um die Vorgänge verschiedener Arten von Eingangs- und Ausgangsdokumenten abzuschließen. Dies verbessert offensichtlich die Wiederverwendbarkeit und Skalierbarkeit des Systems und verringert die Wartungsschwierigkeiten. Abbildung 1-4 Der Vorteil des Strategiemusters liegt in der Trennung von Algorithmus und Umgebung. Die beiden können sich unabhängig voneinander entwickeln. Es ist ersichtlich, dass das Strategiemuster für die folgenden Situationen geeignet ist: · Wenn der Unterschied zwischen vielen verwandten Klassen besteht nur in ihrem Verhalten. Das Strategiemuster ermöglicht es einem Objekt, dynamisch ein Verhalten unter vielen auszuwählen. · Wenn es mehrere alternative Algorithmen gibt, um ein Ziel zu erreichen, beispielsweise solche, die Sie auf der Grundlage unterschiedlicher Kompromisse (d. h. der Anwendung unterschiedlicher Strategien) definieren. Diese spezifischen Algorithmen können in abgeleitete Klassen der abstrakten Algorithmusklasse gekapselt werden und über die einheitliche Schnittstelle der abstrakten Algorithmusklasse verfügen. Durch Polymorphismus kann der Client einen beliebigen bestimmten Algorithmus auswählen, solange dieser ein Objekt einer abstrakten Algorithmusklasse enthält. · Wenn ein Algorithmus Daten verwendet, die dem Client nicht zur Verfügung stehen. Durch die Verwendung des Strategiemusters wird vermieden, dass komplexe algorithmenbezogene Datenstrukturen offengelegt werden. Tatsächlich muss der Kunde die Kenntnisse und Daten im Zusammenhang mit dem Algorithmus nicht kennen. · Wenn eine Klassendefinition viele Verhaltensweisen aufweist und mehrere bedingte Anweisungen verwendet werden, um die Auswahl dieser Verhaltensweisen zu bestimmen. Das Strategiemuster kann diese Verhaltensweisen auf die entsprechenden spezifischen Strategieklassen übertragen, wodurch mehrfache bedingte Auswahlen vermieden werden, die schwer zu pflegen sind, und objektorientierte Programmierideen verkörpern.
1.2 Struktur und Nutzung
Die Struktur des Strategiemusters ist in Abbildung 1-5 dargestellt und umfasst die folgenden Teilnehmer: · Abstrakte Strategie (TStrategy) – deklariert eine gemeinsame Schnittstelle für alle unterstützten Algorithmen. TContext verwendet diese Schnittstelle, um von TConcreteStrategy definierte und gekapselte Algorithmen aufzurufen. · Konkrete Strategie (TConcreteStrategy) – kapselt spezifische Algorithmen oder Verhaltensweisen. Implementieren Sie die TStrategy-Schnittstelle. · Kontext (TContext) – enthält einen Verweis auf TStrategy. Rufen Sie die TStrategy-Schnittstelle auf, um bestimmte Algorithmen oder Verhaltensweisen dynamisch zu konfigurieren. Abbildung 1-5 Struktur des Strategiemusters Im Strategiemuster wird der ausgewählte Algorithmus durch die Interaktion von TStrategy und TContext implementiert. Beim Aufruf des Algorithmus kann TContext alle vom Algorithmus benötigten Daten an TStrategy übergeben. Alternativ kann der TContext sich selbst als Parameter an die TStrategy-Operation übergeben. Wenn ein TContext eine Client-Anfrage an seine TStrategy weiterleitet, erstellt der Client normalerweise ein TConcreteStrategy-Objekt und übergibt es auf diese Weise an den TContext. Der Client interagiert nur mit dem TContext. Normalerweise gibt es eine Reihe von TConcreteStrategy-Klassen, aus denen Kunden wählen können. -------------------------------------------------- ----------------------------------------
Weitere verwandte Artikel und Beispielprogramm-Quellcodes können von der Website des Autors heruntergeladen werden: http://www.liu-yi.net