[JAVA] Modèle de conception ~ État ~

1.Tout d'abord

Voici un résumé du ** modèle d'état ** dans le modèle de conception du GoF.

2. Quel est le modèle de l'État?

3. Exemple de diagramme de classes

State.PNG

4. Exemple de programme

Il s'agit d'un programme de gestion sûr qui modifie le fonctionnement des boutons en fonction des conditions de jour et de nuit.

4-1. Interface contextuelle

Une interface qui gère les changements d'état du coffre-fort et communique avec le centre de sécurité.

Context.java


public interface Context {
	//Réglage de l'heure
	public abstract void setClock(int hour);
	//Changement d'état
	public abstract void changeState(State state);
	//Appel du gardien du centre de sécurité
	public abstract void callSecurityCenter(String msg);
	//Dossier du centre de sécurité
	public abstract void recordLog(String msg);
}

4-2. Classe SafeFrame

Une classe qui implémente l'interface de contexte. Il dispose d'une interface utilisateur telle que des boutons et un affichage à l'écran.

SafeFrame.java


import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SafeFrame extends Frame implements ActionListener, Context {

	private TextField textClock = new TextField(60);
	private TextArea textScreen = new TextArea(10, 60);
	private Button buttonUse = new Button("Utilisation sûre");
	private Button buttonAlarm = new Button("cloche d'urgence");
	private Button buttonPhone = new Button("Appel normal");
	private Button buttonExit = new Button("Fin");

	private State state = DayState.getInstance();

	public SafeFrame(String title) {
		super(title);

		setBackground(Color.lightGray);
		setLayout(new BorderLayout());
		add(textClock, BorderLayout.NORTH);
		textClock.setEditable(false);
		add(textScreen, BorderLayout.CENTER);
		textScreen.setEditable(false);

		Panel panel = new Panel();
		panel.add(buttonUse);
		panel.add(buttonAlarm);
		panel.add(buttonPhone);
		panel.add(buttonExit);
		add(panel, BorderLayout.SOUTH);

		pack();
		show();

		buttonUse.addActionListener(this);
		buttonAlarm.addActionListener(this);
		buttonPhone.addActionListener(this);
		buttonExit.addActionListener(this);
	}

	//Viens ici quand on appuie sur le bouton
	public void actionPerformed(ActionEvent e) {
		System.out.println(e.toString());
		if (e.getSource() == buttonUse) {
			//Bouton d'utilisation en toute sécurité
			state.doUse(this);
		} else if (e.getSource() == buttonAlarm) {
			//Bouton de sonnerie d'urgence
			state.doAlarm(this);
		} else if (e.getSource() == buttonPhone) {
			//Bouton d'appel normal
			state.doPhone(this);
		} else if (e.getSource() == buttonExit) {
			//Bouton Terminer
			System.exit(0);
		} else {
			System.out.println("?");
		}
	}

	//Réglage de l'heure
	public void setClock(int hour) {
		String clockstring = "L'heure actuelle est";
		if (hour < 10) {
			clockstring += "0" + hour + ":00";
		} else {
			clockstring += hour + ":00";
		}
		System.out.println(clockstring);
		textClock.setText(clockstring);
		state.doClock(this, hour);
	}

	//Changement d'état
	public void changeState(State state) {
		System.out.println(this.state + "De" + state + "L'état a changé.");
		this.state = state;
	}

	//Appel du gardien du centre de sécurité
	public void callSecurityCenter(String msg) {
		textScreen.append("call! " + msg + "\n");
	}

	//Dossier du centre de sécurité
	public void recordLog(String msg) {
		textScreen.append("record ... " + msg + "\n");
	}
}

4-3. Interface d'état

Une interface qui affiche l'état du coffre-fort.

State.java


public interface State {
	//Réglage de l'heure
	public abstract void doClock(Context context, int hour);
	//Utilisation sûre
	public abstract void doUse(Context context);
	//cloche d'urgence
	public abstract void doAlarm(Context context);
	//Appel normal
	public abstract void doPhone(Context context);
}

4-4. Classe DayState

Une classe qui implémente l'interface State. Représente la condition diurne.

DayState.java


public class DayState implements State {
	private static DayState singleton = new DayState();

	private DayState() {
	}

	public static State getInstance() {
		return singleton;
	}

	public void doClock(Context context, int hour) {
		if (hour < 9 || 17 <= hour) {
			context.changeState(NightState.getInstance());
		}
	}

	public void doUse(Context context) {
		context.recordLog("Utilisation sûre(Jour)");
	}

	public void doAlarm(Context context) {
		context.callSecurityCenter("cloche d'urgence(Jour)");
	}

	public void doPhone(Context context) {
		context.callSecurityCenter("Appel normal(Jour)");
	}

	public String toString() {
		return "[Jour]";
	}
}

4-5. Classe NightState

Une classe qui implémente l'interface State. Représente la condition nocturne

NightState.java


public class NightState implements State {
	private static NightState singleton = new NightState();

	private NightState() {
	}

	public static State getInstance() {
		return singleton;
	}

	public void doClock(Context context, int hour) {
		if (9 <= hour && hour < 17) {
			context.changeState(DayState.getInstance());
		}
	}

	public void doUse(Context context) {
		context.callSecurityCenter("Urgence: utilisez le coffre-fort la nuit!");
	}

	public void doAlarm(Context context) {
		context.callSecurityCenter("cloche d'urgence(Nuit)");
	}

	public void doPhone(Context context) {
		context.recordLog("Enregistrement des appels de nuit");
	}

	public String toString() {
		return "[Nuit]";
	}
}

4-6. Classe principale

Cette classe effectue le traitement principal.

Main.java


public class Main {
	public static void main(String[] args) {
		SafeFrame frame = new SafeFrame("State Sample");
		while (true) {
			for (int hour = 0; hour < 24; hour++) {
				frame.setClock(hour);
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
				}
			}
		}
	}
}

4-7. Résultat de l'exécution

pg.png

5. Avantages

La politique de ** fractionnement et intégration ** apparaît souvent dans la programmation. Le modèle State exprime l'état en tant que classe. Chaque état concret est exprimé comme une classe distincte et divisé. Lors de l'implémentation de DayState, les programmeurs n'ont plus besoin de connaître les autres classes (NightState). Dans l'exemple de programme, il n'y avait que deux états, mais le modèle d'état sera efficace lorsqu'il y a plus d'états.

  1. GitHub

7. Liste des modèles de conception

8. Référence

Cet article et exemple de programme ont été créés à partir des livres suivants.

C'était très facile à comprendre et j'ai beaucoup appris. Je vous remercie. Les explications détaillées des modèles de conception et des exemples de programmes sont écrites, veuillez donc également consulter les livres.

Recommended Posts

Modèle de conception ~ État ~
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception ~ Proxy ~
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (2): constructeur
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Commande ~
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception ~ Méthode d'usine ~
Modèle de conception ~ Usine abstraite ~
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
Modèle de conception ~ Chaîne de responsabilité ~
[Design pattern] Bibliothèque de base Java
Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception mâché C #: TemplateMethod
Exemple d'application du modèle de conception (n ° 1)
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de prototype
Motif de souvenir
Quelle fabrique de modèles de stratégie, pas un état
Motif médiateur
Modèle d'itérateur
Motif composite
Modèle d'observateur
Modèle de constructeur
Modèle de pont
Modèle de commande
Modèle de constructeur
Modèle de stratégie
Modèle d'itérateur
Modèle de visiteur
Modèle d'adaptateur
Modèle de proxy
Modèle de stratégie
Motif composite
Motif singleton
Motif singleton
Modèle de prototype
[Modèle de conception] Logique commune avec la méthode de modèle
Modèle de façade
Motif décorateur
Modèle de poids mouche
Motif décorateur
Modèle de médiateur
J'ai étudié le modèle d'état et le modèle de stratégie
Motif de façade