Um staatliche und politische Muster in Java -Anwendungen korrekt zu verwenden, müssen Entwickler den Unterschied zwischen den beiden Mustern klar kennen. Obwohl die Struktur der staatlichen Modi und politischen Modi sehr ähnlich ist, folgen sie auch dem Prinzip des Öffnens und Schließens, was das „O“ des festen Designprinzips darstellt, ihre Absichten sind völlig unterschiedlich. Das politische Muster in Java besteht darin, eine Reihe verwandter Algorithmen zu verkapulieren, wodurch Anrufer Laufzeitflexibilität bieten. Der Anrufer kann zur Laufzeit verschiedene Algorithmen auswählen, ohne die Kontextklasse mithilfe der Richtlinie zu ändern. Zu den klassischen Beispielen für die Verwendung von Richtlinienmustern gehören die Implementierung von Verschlüsselungsalgorithmen, Komprimierungsalgorithmen und Sortieralgorithmen. Andererseits verwendet der Statusmodus ein Objekt, um unterschiedliche Verhaltensweisen in verschiedenen Zuständen zu zeigen. Objekte in der realen Welt haben auch Staaten, und sie werden sich nach ihren Staaten unterschiedlich verhalten. Beispielsweise kann ein Verkaufsautomaten nur Artikel im Hascoin -Bundesstaat verkaufen. Wenn Sie keine Münzen einfügen, wird es keine Waren verkaufen. Jetzt können Sie den Unterschied zwischen dem politischen Modus und dem Zustandsmodus deutlich erkennen, ihr Zweck ist unterschiedlich. Der Statusmodus hilft einem Objekt, seinen Status zu verwalten, während der Richtlinienmodus Kunden unterschiedliche Verhaltensweisen auswählen kann. Ein weiterer Unterschied, der nicht leicht zu erkennen ist, ist, wer Verhaltensänderungen vorantreibt. Im Richtlinienmodus ist es kundenorientiert, die unterschiedliche Richtlinien für Kontextinformationen liefert. Im Zustandsmodus wird die staatliche Migration durch den Kontext oder den Zustandsobjekt selbst verwaltet. Wenn Sie den Status im Statusobjekt ändern, muss er einen Verweis auf den Kontext enthalten, was bedeutet, dass für die Verkaufsautomat die SetState -Methode aufgerufen werden kann, um den aktuellen Kontextzustand zu ändern. Andererseits enthält das Richtlinienobjekt keinen Hinweis auf den Kontext, und sein Kunde übergibt die ausgewählte Richtlinie an den Kontext. Strategie- und Staatsmuster sind die einfachsten Interviewfragen zu Java -Designmustern. In diesem Artikel über Java -Designmuster werden wir dies ausführlich vorstellen. Wir werden die Ähnlichkeiten und Unterschiede zwischen den beiden Modi untersuchen, die dazu beitragen, Ihr Verständnis der beiden Modi zu verbessern.
Ähnlichkeiten zwischen staatlichem Modus und Richtlinienmodus:
Wenn Sie sich die UML -Grafiken von Richtlinienmustern und Zustandsmustern ansehen, sehen sie sehr ähnlich aus. Im Zustandsmodus wird das Objekt, das das Statusobjekt zum Ändern des Verhaltens verwendet, als Kontextobjekt bezeichnet. In ähnlicher Weise ist das Objekt, das das Strategieobjekt zum Ändern des Verhaltens verwendet, im Strategiemodus auch ein Kontextobjekt. Denken Sie daran, dass der Client mit dem Kontextobjekt interagiert. Im Zustandsmodus vervollständigt Kontext den Methodenaufruf des Zustandsobjekts. Das aktuelle Objekt im Kontext ist das spezifische Zustandsobjekt. Im Richtlinienmodus betreibt der Kontext auch das Richtlinienobjekt. Dieses Objekt wird entweder als Parameter übergeben oder beim Erstellen des Kontextobjekts bereitgestellt.
Schauen wir uns einige Ähnlichkeiten zwischen diesen beiden Kern -Java -Designmustern an:
Sowohl der staatliche Modus als auch der Politikmodus sind einfach neue Zustände oder Richtlinien hinzuzufügen, ohne die Verwendung der Verwendung zu beeinflussen. Beide folgen dem Entwurfsprinzip des Öffnens und Schließens, was bedeutet, dass Ihr Design für Erweiterungen offen ist und für Modifikationen geschlossen ist. In diesen beiden Modi wird der Kontext zur Änderung geschlossen und fügt einen neuen Staat oder eine Richtlinie hinzu. Sie müssen das Kontextobjekt nicht in anderen Zuständen ändern oder nur kleine Änderungen erfordern. So wie das Kontextobjekt im Statusmodus einen Anfangszustand hat, hat der Kontext im Richtlinienmodus normalerweise auch eine Standardrichtlinie.
Der Zustandsmodus verkauft verschiedene Verhaltensweisen in den Wegen verschiedener Zustandsobjekte, während der Richtlinienmodus verschiedene Verhaltensweisen in Bezug auf verschiedene politische Objekte zusammenfasst.
Beide Muster beruhen auf bestimmten Unterklassen, um ein spezifisches Verhalten zu erreichen. Jede spezifische Richtlinie erstreckt sich von einer abstrakten Richtlinienklasse, und jeder Staat ist auch eine Schnittstelle, die zur Darstellung von Zuständen oder einer Unterklasse der abstrakten Klasse verwendet wird.
Status -Modus -Instanz
öffentliche Klasse WindowState {private String stateValue; public WindowState (String StateValue) {this.StateValue = StateValue; } public String getStateValue () {return stateValue; } public void setStateValue (String StateValue) {this.StateValue = StateValue; } public void handle () { /** führen unterschiedliche Operationen gemäß verschiedenen Zuständen durch und wechseln Sie dann den Status* / if ("Fenster" .Eequals (StateValue)) {switchWindow (); this.stateValue = "Vollbild"; } else if ("fullscreen" .equals (stateValue)) {switchFullScreen (); this.stateValue = "Fenster"; }} private void switchwindow () {System.out.println ("zum Fensterzustand wechseln"); } private void STANDFAFFFFOFFULSCREEN () {System.out.println ("Switch to Vollbildstaat"); }} / *** Nutzung des Staates*/ Public Class WindowContext {privater Fensterstatus; public windowContext (windowState Status) {this.state = STAAT; } public WindowState getState () {return state; } public void setState (WindowState Status) {this.state = Status; } public void switchState () {this.state.handle (); }} /** Zustandsmodus des Zustands (Zustands). WindowState ("Fenster")); context.switchState (); context.switchState (); context.switchState (); context.switchState (); context.switchState (); context.switchState (); }}Wechseln Sie zum Fensterstatus zum Vollbildstatus zum Fensterzustand zum Vollbildstatus zu
Beispiel für Richtlinienmodus
/ *** Produktwerbung* Diese Kategorie lautet: Cash Collection*/ Public Interface IcashSuper {Double AcceptCash (Double Money); } / ** * Normale Cash Collection * @Author Stone * * */ öffentliche Klasse Cashnormen implementiert IcashSuper {@Override public double AccordCash (Double Money) {Return Money; }} / ** * Bargeld wird bei Rabatten erfasst * @Author Stone * */ Public Class CashRebate implementiert IcashSuper {privater Doppelrabatt; // Rabatt public CashRebate (Doppelrabatt) {this.Rebate = Rabatt; } @Override public double AcceptCash (Double Money) {Neue BigDecimal zurückgeben (Geld * Rabatt / 10) .SetsCale (2, BigDecimal.round_Half_Up) .DoubleValue (); }} / ** * Cash -Rabatt mit Bargeld * @Author Stone * */ Public Class Cashleturn implementiert Icashsuper {private Doppelgeldkondition; // Cashback Mindestbetrag privat Double ReturnMoney; // Rückgabebetrag public cashleturn (doppelte MoneyCondition, Double ReturnMoney) {this.moneyCondition = MoneyCondition; this.returnmoney = returnMoney; } @Override public double AcceptCash (Double Money) {// multiple Rabatt if (Money> = MoneyCondition) {Return Money - math.floor (Geld/GeldCondition) * returnMoney; } else {return Money; }}} / *** Führen Sie das entsprechende Verhalten anhand der bestandenen Richtlinienklasse aus*/ öffentliche Klasse CashContext {private icashSuper Casher; public CashContext () {} public CashContext (ICashSuper Casher) {this.casher = Casher; } public void setCasher (ICashSuper Casher) {this.casher = Casher; } // Gemäß dem spezifischen politischen Objekt das Algorithmusverhalten, es public double AcceptCash (Double Money) {return this.casher.acceptcash (Geld); }} public class test {public static void main (String [] args) {Double Money = 998; // Originalpreis CashContext CashContext = new CashContext (neuer Cashnormalen ()); System.out.println ("Originalpreis:" + CashContext.acceptcash (Geld)); // Allgemeine Strategie CashContext.setCasher (New CashRebate (8.5)); System.out.println ("85% Rabatt:" + CashContext.acceptcash (Geld)); // Rabattstrategie 85% Rabatt auf CashContext.setCasher (neuer Cashreturn (300, 50)); System.out.println ("Return 50 If über 300:" + CashContext.acceptcash (Geld)); // Cashback -Strategie 50 Wenn über 300}}}Originalpreis: 998,0 85% Rabatt: 848,3 Rabatt für 50: 848,0 über 300
Der Unterschied zwischen Richtlinienmodus und Zustandsmodus
Wir haben erfahren, dass die beiden Muster in der Struktur sehr ähnlich sind, aber sie haben immer noch unterschiedliche Teile. Schauen wir uns einige der wichtigsten Unterschiede zwischen ihnen an.
Dies sind alle Unterschiede zwischen politischen Mustern und Zustandsmustern in Java. Wie gesagt, sie sehen in UML -Diagrammen sehr ähnlich, beide folgen dem Prinzip des Öffnens und Schließens und der Einkapselung des Verhaltens. Der Richtlinienmodus wird verwendet, um Algorithmen oder Richtlinien zu verkapulieren. Es wird dem Kontextobjekt als Parameter oder Kombinationsobjekt zur Laufzeit zur Verfügung gestellt, während der Statusmodus zur Verwaltung der Statusmigration verwendet wird.