Afin d'utiliser correctement les modèles d'état et de politique dans les applications Java, les développeurs doivent connaître clairement la différence entre les deux modèles. Bien que la structure des modes d'État et des modes de politique soit très similaire, ils suivent également le principe de l'ouverture et de la fermeture, représentant le «O» du principe de conception solide, leurs intentions sont complètement différentes. Le modèle de politique en Java est d'encapsuler un ensemble d'algorithmes connexes, offrant aux appelants une flexibilité d'exécution. L'appelant peut choisir différents algorithmes lors de l'exécution sans modifier la classe de contexte à l'aide de la stratégie. Les exemples classiques d'utilisation de modèles de stratégie comprennent la mise en œuvre des algorithmes de chiffrement, des algorithmes de compression et des algorithmes de tri. D'un autre côté, le mode State utilise un objet pour afficher différents comportements dans différents états. Les objets dans le monde réel ont également des États, et ils se comporteront différemment selon leurs États. Par exemple, un distributeur automatique ne peut vendre des articles qu'à Hascoin State. Si vous ne remplissez pas de pièces de monnaie, elle ne vendra pas de marchandises. Maintenant, vous pouvez clairement voir la différence entre le mode politique et le mode état, leur objectif est différent. Le mode d'état aide un objet à gérer son état, tandis que le mode politique permet aux clients de choisir différents comportements. Une autre différence qui n'est pas facile à voir est de savoir qui stimule les changements de comportement. En mode politique, il est axé sur le client, qui fournit différentes politiques pour les informations de contexte. En mode état, la migration de l'état est gérée par le contexte ou l'objet d'état lui-même. De même, si vous modifiez l'état de l'objet d'état, il doit maintenir une référence au contexte, ce qui signifie que pour le distributeur automatique, il peut appeler la méthode SetState pour modifier l'état de contexte actuel. D'un autre côté, l'objet politique ne tient pas de référence au contexte et son client transmet la politique sélectionnée au contexte. La stratégie et les modèles d'État sont les questions d'entrevue les plus faciles sur les modèles de conception Java. Dans cet article sur les modèles de conception Java, nous le présenterons en détail. Nous explorerons les similitudes et les différences entre les deux modes, ce qui vous aidera à améliorer votre compréhension des deux modes.
Similitudes entre le mode état et le mode politique:
Si vous regardez les graphiques UML des modèles de stratégie et des modèles d'état, ils semblent très similaires. En mode état, l'objet qui utilise l'objet d'état pour changer de comportement est appelé un objet de contexte. De même, en mode stratégie, l'objet qui utilise l'objet de stratégie pour changer de comportement est également un objet de contexte. N'oubliez pas que le client interagit avec l'objet de contexte. En mode état, le contexte proxys l'appel de la méthode de l'objet d'état. L'objet actuel en contexte est l'objet d'état spécifique. En mode politique, le contexte fonctionne également l'objet politique. Cet objet est passé en tant que paramètre ou est fourni lors de la création de l'objet contextuel.
Jetons un coup d'œil à certaines similitudes entre ces deux modèles de conception Java de base:
Le mode d'état et le mode politique sont faciles à ajouter de nouveaux états ou politiques sans affecter leur utilisation, les deux suivent le principe de conception de l'ouverture et de la fermeture, ce qui signifie que votre conception est ouverte aux extensions et fermée aux modifications. Dans ces deux modes, le contexte est fermé pour la modification et ajoute un nouvel état ou une politique. Vous n'avez pas besoin de modifier l'objet de contexte dans d'autres états ou de nécessiter uniquement de petites modifications. Tout comme l'objet contextuel en mode état aura un état initial, le contexte en mode politique a généralement une stratégie par défaut.
Le mode d'état résume différents comportements sur la manière de différents objets d'état, tandis que le mode politique résume différents comportements en termes de différents objets politiques.
Les deux modèles reposent sur des sous-classes spécifiques pour obtenir un comportement spécifique. Chaque politique spécifique s'étend à partir d'une classe de politique abstraite, et chaque état est également une interface utilisée pour représenter les États ou une sous-classe de la classe abstraite.
Instance de mode d'état
classe publique 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 mandeins () {/ * * effectuer différentes opérations en fonction des différents états, puis de changer l'état * / if ("fenêtre" .equals (stateValue)) {switchwindow (); this.stateValue = "plein écran"; } else if ("fullccreen" .equals (stateValue)) {switchfullScreen (); this.stateValue = "Window"; }} private void switchwindow () {System.out.println ("Switch à l'état de la fenêtre"); } private void switchfullScreen () {System.out.println ("Switch to Full Screen State"); }} / ** * Utilisation de l'état * / classe publique WindowContext {Private WindowState State; public windowContext (WindowState State) {this.state = state; } public windowState getState () {return State; } public void setState (WindowState State) {this.state = state; } public void switchState () {this.state.handle (); }} / * * État (état) mode comportemental * modifie à la fois l'état de l'objet et le comportement de l'objet * Selon l'état, modifier le comportement * / le test de classe publique {public static void main (String [] args) {/ * * Il n'y a que deux valeurs d'état dans cet exemple, qui sont contrôlées par la classe d'état elle-même * Vous pouvez également contrôler la valeur de l'état et la fenêtre de la fenêtre); context.switchState (); context.switchState (); context.switchState (); context.switchState (); context.switchState (); context.switchState (); }}Imprimer
Passez à l'état de fenêtre à l'état plein écran à l'état de la fenêtre à l'état plein écran
Exemple de mode politique
/ ** * Promotion du produit * Cette catégorie est: Cash Collection * / Interface publique iCashSuper {double acceptCash (double monnaie); } / ** * COLLECTION NORMALE CASS * @Author Stone * * / Classe publique Cashnormal Implements IcashSuper {@Override public double acceptcash (Double Money) {Return Money; }} / ** * Cash est collecté à des réductions * @Author Stone * * / Public Class CashRebate implémente iCashSuper {Double remise privée; // Discount Public CashRebate (double remise) {this.rebate = remise; } @Override public Double AcceptCash (Double Money) {Return new BigDecimal (Money * Rebate / 10) .SetScale (2, bigdecimal.round_half_up) .doubleValue (); }} / ** * Rebat de trésorerie avec espèces * @author Stone * * / Classe publique Cashreturn implémente iCashSuper {private Double MoneyCondition; // Montant minimum de cashback privé à double retour à double retour; // Retour Montant public Cashreturn (Double MoneyCondition, Double Returnmoney) {this.moneyCondition = MoneyCondition; this.returnmoney = returnmoney; } @Override public double acceptcash (double monnaie) {// Rebat multiple if (Money> = MoneyCondition) {return Money - Math.floor (Money / MoneyCondition) * returnmoney; } else {retourner de l'argent; }}} / ** * Exécutez le comportement correspondant en fonction de la classe de politique adoptée * / classe publique CashContext {Private IcashSuper Casher; public CashContext () {} public CashContext (iCashSuper Casher) {this.Casher = Casher; } public void setCasher (iCashSuper cachers) {this.casher = cacheur; } // Selon l'objet de politique spécifique, le comportement de l'algorithme de l'appeler public double accepte (double monnaie) {retourne this.casher.acceptcash (argent); }} Test de classe publique {public static void main (String [] args) {double money = 998; // Prix d'origine CashContext CashContext = nouveau CashContext (nouveau Cashnormal ()); System.out.println ("Prix d'origine:" + CashContext.AcceptCash (Money)); // Stratégie générale CashContext.SetCasher (New CashRebate (8.5)); System.out.println ("85% de réduction:" + CashContext.AcceptCash (Money)); // Stratégie de réduction 85% de réduction sur CashContext.SetCasher (Nouveau Cashreturn (300, 50)); System.out.println ("Retour 50 Si plus de 300:" + CashContext.AcceptCash (Money)); // Stratégie de cashback 50 si plus de 300}}Imprimer
Prix d'origine: 998,0 85% de réduction: 848,3 Rebat pour 50: 848,0 sur 300
La différence entre le mode politique et le mode état
Nous avons appris que les deux modèles sont très similaires en structure, mais ils ont toujours des parties différentes. Jetons un coup d'œil à certaines des principales différences entre elles.
Ce sont toutes les différences entre les modèles de politique et les modèles d'état en Java. Comme je l'ai dit, ils ont l'air très similaires dans les diagrammes UML, les deux suivent le principe d'ouverture et de clôture et d'encapsulation. Le mode politique est utilisé pour encapsuler des algorithmes ou des politiques. Il sera fourni à l'objet contextuel en tant que paramètre ou objet combiné au moment de l'exécution, tandis que le mode d'état est utilisé pour gérer la migration de l'état.