[JAVA] Entwurfsmuster ~ Memento ~

1. Zuallererst

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

2. Was ist das Memento-Muster?

3. Beispielklassendiagramm

Memento.PNG

4. Beispielprogramm

Es ist ein Programm, das Ihr Geld und Ihre Habseligkeiten (Obst) entsprechend dem Würfelwurf ändert, den Sie gewürfelt haben. Speichern oder rückgängig machen, je nach Situation.

4-1. Spielerklasse

Dies ist die Klasse des Hauptcharakters, der das Spiel spielt. Erstellen Sie eine Instanz von Memento.

Gamer.java


package game;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

public class Gamer {

	private int money;
	private ArrayList<String> fruits = new ArrayList<String>();
	private Random random = new Random();
	private static String[] fruitsname = {
			"Apfel", "Traube", "Banane", "Mandarine",
	};

	public Gamer(int money) {
		this.money = money;
	}

	public int getMoney() {
		return money;
	}

	 //Wette ... Spielfortschritt
	public void bet() {
		//Würfeln
		int dice = random.nextInt(6) + 1;

		if (dice == 1) {
			//1. ... Ihr Geld wird steigen
			money += 100;
			System.out.println("Der Geldbetrag, den ich habe, hat zugenommen.");
		} else if (dice == 2) {
			//2. ... die Hälfte Ihres Geldes
			money /= 2;
			System.out.println("Ihr Geld wurde halbiert.");
		} else if (dice == 6) {
			//6 Augen ... Früchte bekommen
			String f = getFruit();
			System.out.println("Früchte(" + f + ")ich habe");
			fruits.add(f);
		} else {
			//Sonst passiert nichts
			System.out.println("Nichts ist passiert.");
		}
	}

	//Mach einen Schnappschuss
	public Memento createMemento() {
		Memento m = new Memento(money);
		Iterator it = fruits.iterator();
		while (it.hasNext()) {
			String f = (String) it.next();
			if (f.startsWith("Köstlich")) {
				//Speichern Sie nur köstliche Früchte
				m.addFruit(f);
			}
		}
		return m;
	}

	//Rückgängig machen
	public void restoreMemento(Memento memento) {
		this.money = memento.money;
		this.fruits = memento.getFruits();
	}

	public String toString() {
		return "[money = " + money + ", fruits = " + fruits + "]";
	}

	private String getFruit() {
		String prefix = "";
		if (random.nextBoolean()) {
			prefix = "Köstlich";
		}
		return prefix + fruitsname[random.nextInt(fruitsname.length)];
	}
}

4-2. Erinnerungsklasse

Eine Klasse, die den Staat Geme darstellt.

Memento.java


package game;

import java.util.ArrayList;

public class Memento {

	int money;
	ArrayList<String> fruits;

	public int getMoney() {
		return money;
	}

	Memento(int money) {
		this.money = money;
		this.fruits = new ArrayList<String>();
	}

	void addFruit(String fruit) {
		fruits.add(fruit);
	}

	ArrayList<String> getFruits() {
		return (ArrayList<String>) fruits.clone();
	}
}

4-3 Hauptklasse

Diese Klasse führt die Hauptverarbeitung durch. Das Spiel vorantreiben. Es speichert auch eine Instanz von Memento und stellt bei Bedarf den Gamer-Status wieder her.

Main.java


import game.Gamer;
import game.Memento;

public class Main {

	public static void main(String[] args) {
		//Erster Besitz ist 100
		Gamer gamer = new Gamer(100);
		//Speichern Sie den Ausgangszustand
		Memento memento = gamer.createMemento();

		for (int i = 0; i < 10; i++) {
			System.out.println("==== " + i);
			System.out.println("Aktueller Status:" + gamer);

			//Das Spiel vorantreiben
			gamer.bet();

			System.out.println("Das Geld, das du hast" + gamer.getMoney() + "Es wurde ein Kreis.");

			if (gamer.getMoney() > memento.getMoney()) {
				System.out.println("(Da es stark zugenommen hat, speichern wir den aktuellen Status.)");
				memento = gamer.createMemento();
			} else if (gamer.getMoney() < memento.getMoney() / 2) {
				System.out.println("(Es hat stark abgenommen, also kehren wir zum vorherigen Zustand zurück.)");
				gamer.restoreMemento(memento);
			}
		}
	}
}

4-4 Ausführungsergebnis

==== 0
Aktueller Status:[money = 100, fruits = []]
Früchte(Leckere Banane)ich habe
Das Geld, das ich habe, ist jetzt 100 Yen.
==== 1
Aktueller Status:[money = 100, fruits = [Leckere Banane]]
Der Geldbetrag, den ich habe, hat zugenommen.
Das Geld, das ich habe, ist jetzt 200 Yen.
(Da es stark zugenommen hat, speichern wir den aktuellen Status.)
==== 2
Aktueller Status:[money = 200, fruits = [Leckere Banane]]
Nichts ist passiert.
Das Geld, das ich habe, ist jetzt 200 Yen.
==== 3
Aktueller Status:[money = 200, fruits = [Leckere Banane]]
Der Geldbetrag, den ich habe, hat zugenommen.
Das Geld, das ich habe, ist jetzt 300 Yen.
(Da es stark zugenommen hat, speichern wir den aktuellen Status.)
==== 4
Aktueller Status:[money = 300, fruits = [Leckere Banane]]
Nichts ist passiert.
Das Geld, das ich habe, ist jetzt 300 Yen.
==== 5
Aktueller Status:[money = 300, fruits = [Leckere Banane]]
Ihr Geld wurde halbiert.
Das Geld, das ich habe, ist jetzt 150 Yen.
==== 6
Aktueller Status:[money = 150, fruits = [Leckere Banane]]
Nichts ist passiert.
Das Geld, das ich habe, ist jetzt 150 Yen.
==== 7
Aktueller Status:[money = 150, fruits = [Leckere Banane]]
Der Geldbetrag, den ich habe, hat zugenommen.
Das Geld, das ich habe, ist jetzt 250 Yen.
==== 8
Aktueller Status:[money = 250, fruits = [Leckere Banane]]
Ihr Geld wurde halbiert.
Der Geldbetrag, den ich habe, beträgt jetzt 125 Yen.
(Es hat stark abgenommen, also kehren wir zum vorherigen Zustand zurück.)
==== 9
Aktueller Status:[money = 300, fruits = [Leckere Banane]]
Nichts ist passiert.
Das Geld, das ich habe, ist jetzt 300 Yen.

5. Vorteile

Mit dem Memento-Muster können Sie ** rückgängig machen, wiederholen, Arbeitsverlauf erstellen, aktuellen Status speichern ** und vieles mehr. Wenn Sie rückgängig machen möchten, fragen Sie sich möglicherweise, ob Sie diese Funktion in der Gamer-Klasse erstellen sollten. In der Hauptklasse entscheiden Sie, wann Sie einen Schnappschuss machen und wann Sie rückgängig machen möchten, und übernehmen die Rolle des Erinnerungsstücks. Auf der anderen Seite erledigen Sie in der Gamer-Klasse die Aufgabe, die Rolle des Memento zu erstellen und Ihren eigenen Status unter Verwendung der angegebenen Rolle des Memento wiederherzustellen. Sie können sehen, dass die Rollen auf diese Weise zwischen der Hauptklasse und der Gamer-Klasse aufgeteilt sind. Wenn Sie die Rollen wie folgt aufteilen,

Selbst wenn Sie die Korrektur vornehmen möchten, müssen Sie die Gamer-Rolle nicht ändern.

  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 zu den Entwurfsmustern und Beispielprogrammen sind geschrieben. Schauen Sie sich also auch die Bücher an.

Recommended Posts

Entwurfsmuster ~ Memento ~
Erinnerungsmuster
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
C # gekautes Designmuster: TemplateMethod
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Strategiemuster
Iteratormuster
Adaptermuster
Strategiemuster
Singleton-Muster
Singleton-Muster
Prototypmuster
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Fassadenmuster
Besuchermuster
Brückenmuster
PrintObserver "Observer Design Pattern: Beschreibung und Implementierungsbeispiel"
Überdenken des Entwurfsmusters mit Java8 Lambda-Ausdruck & Stream - Befehlsmuster -