[JAVA] Entwurfsmuster ~ Zustand ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Statusmusters ** im GoF-Entwurfsmuster.

2. Wie ist das Zustandsmuster?

3. Beispielklassendiagramm

State.PNG

4. Beispielprogramm

Es ist ein sicheres Verwaltungsprogramm, das die Bedienung der Tasten abhängig von den Tag- und Nachtbedingungen ändert.

4-1. Kontextschnittstelle

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);
}

4-2. SafeFrame-Klasse

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");
	}
}

4-3. Zustandsschnittstelle

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);
}

4-4. DayState-Klasse

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]";
	}
}

4-5. NightState-Klasse

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]";
	}
}

4-6 Hauptklasse

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) {
				}
			}
		}
	}
}

4-7 Ausführungsergebnis

pg.png

5. Vorteile

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.

  1. GitHub

7. Liste der Entwurfsmuster

8. Referenz

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

Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
Entwurfsmuster nach Ruby Template-Methode Musternotiz
C # gekautes Designmuster: TemplateMethod
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Prototypmuster
Erinnerungsmuster
Was für eine Strategiemusterfabrik, kein Staat
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Ich habe das Zustandsmuster und das Strategiemuster studiert
Fassadenmuster