Hier ist eine Zusammenfassung des ** Statusmusters ** im GoF-Entwurfsmuster.
Es ist ein sicheres Verwaltungsprogramm, das die Bedienung der Tasten abhängig von den Tag- und Nachtbedingungen ändert.
Eine Schnittstelle, die Änderungen im Status des Safes verwaltet und mit dem Sicherheitscenter kommuniziert.
Context.java
public interface Context {
//Uhrzeit einstellen
public abstract void setClock(int hour);
//Zustandsänderung
public abstract void changeState(State state);
//Security Center Guard Call
public abstract void callSecurityCenter(String msg);
//Security Center-Datensatz
public abstract void recordLog(String msg);
}
Eine Klasse, die die Kontextschnittstelle implementiert. Es verfügt über eine Benutzeroberfläche wie Schaltflächen und Bildschirmanzeige.
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("Sichere Verwendung");
private Button buttonAlarm = new Button("Notglocke");
private Button buttonPhone = new Button("Normaler Anruf");
private Button buttonExit = new Button("Ende");
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);
}
//Komm her, wenn der Knopf gedrückt wird
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
if (e.getSource() == buttonUse) {
//Taste für die sichere Verwendung
state.doUse(this);
} else if (e.getSource() == buttonAlarm) {
//Notklingelknopf
state.doAlarm(this);
} else if (e.getSource() == buttonPhone) {
//Normale Anruftaste
state.doPhone(this);
} else if (e.getSource() == buttonExit) {
//Schaltfläche "Fertig stellen"
System.exit(0);
} else {
System.out.println("?");
}
}
//Uhrzeit einstellen
public void setClock(int hour) {
String clockstring = "Die aktuelle Zeit ist";
if (hour < 10) {
clockstring += "0" + hour + ":00";
} else {
clockstring += hour + ":00";
}
System.out.println(clockstring);
textClock.setText(clockstring);
state.doClock(this, hour);
}
//Zustandsänderung
public void changeState(State state) {
System.out.println(this.state + "Von" + state + "Der Zustand hat sich geändert.");
this.state = state;
}
//Security Center Guard Call
public void callSecurityCenter(String msg) {
textScreen.append("call! " + msg + "\n");
}
//Security Center-Datensatz
public void recordLog(String msg) {
textScreen.append("record ... " + msg + "\n");
}
}
Eine Schnittstelle, die den Status des Safes anzeigt.
State.java
public interface State {
//Zeiteinstellung
public abstract void doClock(Context context, int hour);
//Sichere Verwendung
public abstract void doUse(Context context);
//Notglocke
public abstract void doAlarm(Context context);
//Normaler Anruf
public abstract void doPhone(Context context);
}
Eine Klasse, die die Statusschnittstelle implementiert. Repräsentiert den Tageszustand.
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("Sichere Verwendung(Tagsüber)");
}
public void doAlarm(Context context) {
context.callSecurityCenter("Notglocke(Tagsüber)");
}
public void doPhone(Context context) {
context.callSecurityCenter("Normaler Anruf(Tagsüber)");
}
public String toString() {
return "[Tagsüber]";
}
}
Eine Klasse, die die Statusschnittstelle implementiert. Repräsentiert den Zustand in der Nacht
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("Notfall: Verwenden Sie den Safe nachts!");
}
public void doAlarm(Context context) {
context.callSecurityCenter("Notglocke(Nacht)");
}
public void doPhone(Context context) {
context.recordLog("Aufzeichnung von Nachtanrufen");
}
public String toString() {
return "[Nacht]";
}
}
Diese Klasse führt die Hauptverarbeitung durch.
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) {
}
}
}
}
}
Die Politik des ** Teilens und Integrierens ** erscheint häufig in der Programmierung. Das Zustandsmuster drückt den Zustand als Klasse aus. Jeder konkrete Zustand wird als separate Klasse ausgedrückt und unterteilt. Während der Implementierung von DayState müssen Programmierer andere Klassen (NightState) nicht mehr kennen. Im Beispielprogramm gab es nur zwei Zustände, aber das Zustandsmuster ist wirksam, wenn mehr Zustände vorhanden sind.
Dieser Artikel und das Beispielprogramm wurden basierend auf den folgenden Büchern erstellt.
Es war sehr leicht zu verstehen und ich habe viel gelernt. Vielen Dank. Die detaillierten Erklärungen der Entwurfsmuster und Beispielprogramme sind geschrieben. Schauen Sie sich also auch die Bücher an.
Recommended Posts