Voici un résumé du ** modèle d'état ** dans le modèle de conception du GoF.
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.
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);
}
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");
}
}
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);
}
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]";
}
}
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]";
}
}
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) {
}
}
}
}
}
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.
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