1. Présentation
Lorsqu'il y a plusieurs états pour un objet dans le système, l'état peut être converti entre eux et l'objet se comporte différemment dans différents états. Le mode d'état sépare l'état d'un objet de l'objet et le résume dans une classe d'état spéciale, afin que l'état de l'objet puisse être modifié de manière flexible. Le mode d'état est un mode comportemental d'objet.
2. Scénarios applicables
Utilisé pour résoudre le problème d'encapsulation de plusieurs transitions d'état d'objets complexes dans le système et les comportements sous différents états. Autrement dit, il s'agit de traiter plusieurs états d'objets et leurs conversions mutuelles.
Iii. Diagramme de classe UML
4. Participants
1), AbstractState (classe d'État abstrait):
La classe d'état abstraite définit les méthodes abstraites du comportement sous différents états, et différentes opérations comportementales sont implémentées dans des sous-classes (différentes sous-classes d'états).
2) ConcreteState (sous-classe d'état qui met en œuvre le comportement dans des états spécifiques):
Sous-classes des classes d'État abstraites, chaque sous-classe implémente un comportement lié à un état de la classe d'environnement (contexte). Chaque classe d'État spécifique correspond à un état spécifique de l'environnement, et le comportement de différents états spécifiques est différent.
3) Contexte (classe d'environnement qui possède des objets d'état):
Ayant des attributs d'État, en raison de la diversité de l'environnement, il peut avoir différents états et se comporter différemment dans différents états. Maintenir une instance d'état abstraite dans la classe d'environnement. Cette instance définit l'état de l'environnement actuel (SetState () méthode) et sépare le comportement d'état spécifique et est complété par différentes sous-classes d'état.
5. Apprentissage du cas d'utilisation
1. Résumé Classe d'État: State.java
/ ** * Mode d'état du modèle de conception Java * Classe d'état abstraite * @author [email protected] * * / Classe abstraite publique State {/ ** * Méthode abstraite du comportement de l'état, la sous-classe d'état spécifique implémente la logique du comportement différent * / public abstrait void comportement (); }
2. Sous-classe d'état spécifique A: Concretestatea.java
/ ** * Sous-classe de statut spécifique A * @author [email protected] * / classe publique Concretestatea étend State {@Override public void Behavior () {// Business Behavior of State A, et ce qu'il peut faire lorsqu'il est dans cet état de paiement. paiement"); }}
3. Sous-classe d'état spécifique B: ConcreteStateb.java
/ ** * sous-classe d'état spécifique b * @author [email protected] * * / classe publique ConcreteStateB étend l'état {@Override public void comportement () {// Business Behavior of State B, et ce qu'il peut faire lorsqu'il est dans cet état // par exemple: "le téléphone mobile est en arrêt, System.out.println (" "Le téléphone mobile est dans le temps, System.out.println (" "Le téléphone mobile est dans le temps, le temps, System.out. appelle "); }}
4. Classe d'environnement avec des objets d'état: context.java
/ ** * Classe d'environnement / contexte <br/> * a un objet d'état et peut effectuer la transition entre les états [les modifications d'état / la commutation sont implémentées dans la classe d'environnement] * @author [email protected] * * / classe publique Context {// Maintenir une référence à un objet d'état abstrait d'état privé de l'État; / * * Simuler les attributs des frais d'appel de téléphone portable <br/> * L'état de l'environnement est le suivant: * 1>, lorsque Bill> = 0,00 $: Lorsque l'état est normal, vous pouvez toujours passer des appels * 2>, lorsque la facture <0,00 $: lorsque le téléphone est dû, vous ne pouvez pas passer d'appels * / double facture privée; / ** * Fonction de traitement de l'environnement, l'appel Le comportement de l'instance d'état complète la logique métier <br/> * Références à différents comportements dans différents états * / public void manche () {CheckState (); state.behavior (); } / ** * Vérifiez l'état de l'environnement: les modifications / commutations de l'état sont implémentées dans la classe d'environnement * / private void checkState () {if (bill> = 0,00) {setState (new CansteStatea ()); } else {setState (new ConcreteStateB ()); }} / ** * Définir l'état d'environnement <br/> * Méthode privée, le but est de laisser l'état de l'environnement être contrôlé / commuté par l'environnement système lui-même, et les utilisateurs externes n'ont pas besoin de se soucier de l'état à l'intérieur de l'environnement * @param état * / private void SetState (État State) {this.state = état; } public double getBill () {return bill; } public void setbill (double bill) {this.bill = bill; }}
5. Tester la classe d'appel du client: client.java
classe publique Client {public static void main (String [] args) {context context = new context (); context.setbill (5.50); System.out.println ("Balance actuelle des frais d'appel:" + context.getBill () + "$"); context.handle (); context.setBill (-1,50); System.out.println ("Balance actuelle des frais d'appel:" + context.getBill () + "$"); context.handle (); context.setbill (50,00); System.out.println ("Balance actuelle des frais d'appel:" + context.getBill () + "$"); context.handle (); }} 6. Résultats de l'opération du programme:
Solde des frais d'appel actuel: 5,5 $
Le solde actuel des factures de téléphone peut être fait normalement lorsque le téléphone n'est pas en baisse en raison de l'acompte: -1,5 $
Le solde des frais de téléphone actuel n'est pas autorisé à passer des appels lorsque le téléphone est hors service.
Le téléphone peut passer des appels normalement sans acompte
Vi. Développer
Il existe deux implémentations différentes de la commutation d'état en mode état
Méthode 1: Le changement / commutation de l'état est implémenté dans la classe d'environnement. Comme dans le code de cas d'utilisation ci-dessus, la méthode CheckState () dans la classe de contexte.
/ ** * Vérifiez l'état de l'environnement: les modifications de l'état / la commutation sont implémentées dans la classe d'environnement * / private void checkState () {if (bill> = 0,00) {setState (new CansteTatea ()); } else {setState (new ConcreteStateB ()); }} Méthode 2: Le changement / commutation de l'état est implémenté dans une sous-classe d'état spécifique.
Les étapes de mise en œuvre sont les suivantes:
1) Initialisez un objet d'instance d'état dans la classe de contexte de classe d'environnement et transmettez l'objet de contexte d'environnement en tant que paramètre constructeur de l'état de sous-classe à l'instance de sous-classe d'état spécifique.
Par exemple, dans la classe de contexte.java
// Définit l'état initial this.state = new ConcreteStatea (this);
2) Dans la classe d'état de sous-classe spécifique, selon l'objet de contexte construit, la logique métier juge le statut en appelant la valeur de la propriété de l'objet contextuel.
Par exemple, dans la classe Concretestatea.java, la sous-classe d'état spécifique:
/ ** * Sous-classe d'état spécifique a * @author [email protected] * / classe publique ConcreteStatea étend State {Private Context CTX; public ConcreteStatea (contexte de contexte) {ctx = contexte; } @Override public void Behavior () {// Comportement commercial de l'état A, et que peut-il faire lorsqu'il est dans cet état // par exemple: le téléphone mobile peut passer des appels normalement lorsqu'il n'est pas en baisse en raison de l'acompte System.out.println ("Le téléphone mobile peut passer des appels normalement lorsqu'il n'est pas un acompte"); CheckState (); } / ** * Vérifiez si l'état doit être converti <br/> * La commutation de l'état est implémentée dans la sous-classe d'état spécifique * / private void checkState () {if (ctx.getBill () <0,00) {ctx.setState (new CONCRETESTATEB (CTX)); }}}
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.