Definition: Definieren Sie einen Satz von Algorithmen, verkapulieren Sie jeden Algorithmus und machen Sie sie austauschbar.
Typ: Verhaltensmuster
Klassendiagramm:
Das Richtlinienmuster ist die Einkapselung von Algorithmen, die eine Reihe von Algorithmen in entsprechende Klassen einkapseln, und diese Klassen implementieren dieselbe Schnittstelle und können durch einander ersetzt werden. Im oben erwähnten Verhaltensklassenmodus gibt es ein Muster, das sich auch auf die Kapselung des Algorithmus konzentriert - des Vorlagenmethodemodus. Im Vergleich zum Klassendiagramm können Sie feststellen, dass der Unterschied zwischen dem Richtlinienmodus und dem Vorlagenmethodenmodus nur darin besteht, dass ein separater Kapselungsklassenkontext vorliegt. Der Unterschied zwischen IT und dem Vorlagenmethodenmodus lautet: Im Vorlagenmethodenmodus befindet sich der Hauptteil des aufrufenden Algorithmus in der abstrakten übergeordneten Klasse, während im Strategiemodus der Hauptteil des aufrufenden Algorithmus in den Kontext der Einkapselungsklasse eingefasst wird. Die Strategie Strategie der Abstracy ist im Allgemeinen eine Schnittstelle, der Zweck besteht nur darin, die Spezifikation zu definieren und im Allgemeinen keine Logik enthält. Tatsächlich ist dies nur eine allgemeine Implementierung. In der tatsächlichen Programmierung, da zwischen jeder bestimmten Strategie -Implementierungsklasse unweigerlich eine gewisse Logik besteht, verwenden wir häufig abstrakte Klassen, um die Rolle der Strategie zu spielen und den öffentlichen Code zu verkörpern. Daher wird in vielen Anwendungsszenarien der Schatten des Template -Methodenmusters im Strategiemodus im Allgemeinen angezeigt.
Struktur der politischen Muster
Einkapselungsklasse: Auch als Kontext bezeichnet und sekundäre Einkapselung von Richtlinien besteht darin, direkte Aufrufe der Richtlinien durch hochrangige Module zu vermeiden.
Zusammenfassung Strategie: Normalerweise eine Schnittstelle. Wenn in jeder Implementierungsklasse eine doppelte Logik vorhanden ist, werden abstrakte Klassen verwendet, um diesen Teil des gemeinsamen Codes zu verkapulieren. Zu diesem Zeitpunkt sieht das politische Muster eher dem Vorlagenmethodenmuster aus.
Spezifische Strategie: Spezifische Strategierollen werden normalerweise von einer Reihe von Klassen ausgeführt, die mit Algorithmen eingekapselt sind, und diese Klassen können bei Bedarf frei ersetzt werden.
Beispiele für Anwendungsszenarien:
Liu Bei wird seine Frau in Jiangdong heiraten. Bevor er ging, gab Zhuge Liang Zhao Yun (den besten Mann) drei Tricks und sagte, dass es das schwierige Problem lösen würde, indem er es nach dem Geheimnis des Himmels zerlegt. Hey, sagen wir, es hat das große Problem wirklich gelöst. Am Ende begleitete Zhou Yu seine Frau und brach dann seine Truppen. Lassen Sie uns zuerst sehen, wie diese Szene aussieht.
Sprechen wir zunächst über die Elemente in dieser Szene: drei clevere Tricks, ein cleverer Trick und ein cleverer Trick. Der kluge Trick wurde von Bruder Liang gegeben. Der clevere Trick ist allgemein als cleverer Trick bekannt. Dann ist Zhao Yun ein Arbeiter, der den klugen Trick herausnimmt, ihn ausführt und dann gewinnt. Wie drücke ich diese mit Java -Programmen aus?
Schauen wir uns zuerst das Bild an?
Die drei Tricks sind die gleiche Art von Dingen. Schreiben wir also eine Schnittstelle:
Paket com.yangguangfu.strategy; /**** @Author [email protected]: AFU* Definieren Sie zuerst eine Strategieschnittstelle, die die Grenzfläche der drei Tricks ist, die Zhuge Liang Zhao Yun gegeben hat. */public interface istrategy {// Jeder Trick ist ein ausführbarer Algorithmus. öffentliche void operation (); }
Schreiben Sie dann drei Implementierungsklassen, es gibt drei clevere Tricks:
Ein cleverer Plan: Erste Ankunft in Wu:
Paket com.yangguangfu.strategy; /**** @Author [email protected]: A Fu* Bitten Sie Mr. Qiao, um zu helfen, damit Sun Quan Liu Bei nicht töten kann. */ öffentliche Klasse Backdoor implementiert iStrategy {@Override public void operation () {System.out.println ("Suche nach der Hilfe des alten Qiao Guos, lass Wu Guotai Druck auf die Sonne ausüben, damit Sun Quan Liu Bei nicht töten kann ..."); }}
Der zweite Trick: Bitte geben Sie Wu Guotai ein grünes Licht und lassen Sie es los:
Paket com.yangguangfu.strategy; /**** @Author [email protected]: a fu* Bitte geben Sie Wu Guotai ein grünes Licht. */ public class givengreenlight implementiert iStrategy {@Override public void operation () {System.out.println ("Bitte geben Sie Wu Guotai ein grünes Licht, lassen Sie es los!"); }}
Fertigkeit 3: Frau Sun schneidet das Heck ab und blockiert die Verfolger:
Paket com.yangguangfu.strategy; /**** @Author [email protected]: AFU* Mrs. Sun hat das Heck abgeschnitten und die Verfolger blockiert. */ public class Blacksemy implementiert iStrategy {@Override public void operation () {System.out.println ("Frau. }}
Okay, alle, es gibt drei Tricks, also gibt es einen Ort, an dem sie in den Tipp stecken:
Paket com.yangguangfu.strategy; / ** * * @Author [email protected]: AFU * */ Public Class Context {private iStrategy Strategie; // Konstruktor, welchen Trick möchten Sie Public Context (IStrategy Strategy) {this.strategy = Strategie verwenden; } public void operation () {this.strategy.operate (); }}
Dann trug Zhao Yun drei Tipps mit großem Mut und zog den alten Mann Liu Bei, der bereits in die Reihen älterer Menschen eingetreten war und ein unschuldiges Mädchen heiraten wollte, in seine Frau heiraten. Hallo, geschweige denn, die drei Tricks von Bruder Liang sind wirklich gut. Sehen:
Paket com.yangguangfu.strategy; public class zhaoyun { /*** zhao yun erschien. Nach der Erklärung von Zhuge Liang für ihn nahm er die Tricks wiederum auseinander*/ public static void main (String [] args) {Kontextkontext; // Als ich zum ersten Mal in Wu ankam, zerlegte ich das erste System.out.println ("-----------------------------------------"); context = neuer Kontext (neuer Backdoor ()); context.operate (); // system.out.println ("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n"); // Als Liu Bei glücklich war, nicht bereit zu sein, nicht bereit zu sein, nicht zu sein, nicht bereit zu sein, nicht bereit zu sein, nicht zu sein, nicht zu sein, nicht zu sein, nicht zu sein, nicht zu wollen, abzunehmen, ab Wünsche zu wollen, ab Wünsche zu wollen, abzutunwillen wollen zu wollen, will zu wollen, will zu wollen wollen, wollen zu wollen, will zu wollen wollen zu wollen wollen wollen wollen wollen sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr viel viel viel viel vielüühut sehr sehr sehr sehr sehr sehr vielü kutututututututidut drolut vielüüh viel viel viel viel sehr viel viel viel viel viel viel viel sehr vielüutututututututidututututututututemutut tut dkutkutk k dk dkk d d did tid t t t t t t t t t t Tam Tam Tid T T T T T Tamamyyyyyyyyyyyyyyyyyyyyyiihekiiiiii be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be nicht bereit zu sein, nicht bereit zu sein, nicht bereit zu sein, nicht zu sein, nicht bereit zu sein, nicht bereit zu sein, nicht bereit zu sein, nicht zu sein, nicht zu sein, nicht bereit zu sein, nicht zu sein, nicht bereit zu sein, nicht zu sein, nicht bereit zu sein, nicht zu sein, das dritte Tippsystem zu sein. context = neuer Kontext (new Blackeremy ()); context.operate (); // zerlegen und ausführen System.out.println("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n
Vor- und Nachteile des Richtlinienmodus Die Hauptvorteile des Richtlinienmodus sind:
Richtlinienklassen können frei umgeschaltet werden, und da Richtlinienklassen dieselbe Abstraktion implementieren, können sie frei umgeschaltet werden.
Einfach zu erweitern, ist das Hinzufügen einer neuen Richtlinie für das Richtlinienmodell sehr einfach und kann im Grunde genommen erweitert werden, ohne den ursprünglichen Code zu ändern.
Vermeiden Sie die Verwendung mehrerer Bedingungen. Wenn Sie den Richtlinienmodus nicht verwenden, müssen für alle Algorithmen bedingte Anweisungen verwendet werden, um eine Verbindung herzustellen, und der Algorithmus, der durch bedingte Beurteilung verwendet werden soll. Im vorherigen Artikel haben wir erwähnt, dass die Verwendung mehrerer bedingter Beurteilung sehr schwer aufrechtzuerhalten ist.
Es gibt zwei Hauptnachteile des Strategiemodells:
Durch die Aufrechterhaltung verschiedener politischer Klassen werden zusätzlichen Aufwand für die Entwicklung eingebracht. In dieser Hinsicht haben Sie möglicherweise Erfahrung: Im Allgemeinen übersteigt die Anzahl der politischen Klassen 5, was problematischer ist.
Alle Richtlinienklassen müssen dem Kunden (dem Anrufer) ausgesetzt sein, da er am Kunden verwendet werden kann, sodass der Kunde wissen sollte, welche Richtlinien es gibt, und die Unterschiede zwischen verschiedenen Richtlinien verstehen, sonst sind die Konsequenzen schwerwiegend. Beispielsweise gibt es ein Strategiemodell zum Sortieren von Algorithmen, die drei Algorithmen liefern: Schnellsortier, Blasensortier und Sortieren auswählen. Sollte er die Anwendung dieser drei Algorithmen verstehen, bevor der Client diese Algorithmen verwendet? Beispielsweise muss der Client einen Container verwenden, der durch verknüpfte Listen und Arrays implementiert wird. Muss der Client auch den Unterschied zwischen verknüpften Listen und Arrays verstehen? In dieser Hinsicht steht es im Widerspruch zum dimitianischen Gesetz.
Anwendbare Szenarien
Wenn Sie objektorientiertes Design durchführen, müssen Sie mit dem politischen Muster sehr vertraut sein, da es im Wesentlichen Vererbung und Polymorphismus in objektorientiertem. Nachdem ich den allgemeinen Code des Richtlinienmusters gelesen habe, denke ich, dass ich es während des Entwicklungsprozesses verwendet habe, selbst wenn ich noch nie von dem Richtlinienmuster gehört habe, oder? Zumindest in den folgenden zwei Situationen können Sie das Strategiemodell verwenden.
Die Hauptlogik mehrerer Klassen ist gleich, und es gibt nur geringfügige Unterschiede im Algorithmus und des Verhaltens der teilweisen Logik.
Es gibt mehrere ähnliche Verhaltensweisen oder Algorithmen, und der Client muss dynamisch entscheiden, welche Sie verwenden sollen, damit Sie das Richtlinienmuster verwenden können, um diese Algorithmen zu verkörpern, damit Client anrufen kann.
Das Strategiemodell ist ein einfaches und häufig verwendetes Modell. Wenn wir uns entwickeln, verwenden wir es oft absichtlich oder unbeabsichtigt. Im Allgemeinen wird das Strategiemodell nicht allein verwendet, und es ist häufiger, es in gemischter Weise mit dem Vorlagenmethodenmodus, dem Werksmodus usw. zu verwenden.