[JAVA] Modèle de conception ~ Memento ~

1.Tout d'abord

Voici un résumé du ** modèle Memento ** dans le modèle de conception du GoF.

2. Quel est le modèle Memento?

3. Exemple de diagramme de classes

Memento.PNG

4. Exemple de programme

C'est un programme qui change votre argent et vos effets personnels (fruits) en fonction du jet de dés que vous avez lancé. Enregistrez ou annulez selon la situation.

4-1. Classe de joueur

C'est la classe du personnage principal qui joue au jeu. Créez une instance de 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 = {
			"Pomme", "Grain de raisin", "banane", "Mandarine",
	};

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

	public int getMoney() {
		return money;
	}

	 //Pari ... progression du jeu
	public void bet() {
		//Lancer les dés
		int dice = random.nextInt(6) + 1;

		if (dice == 1) {
			//1er ... Votre argent augmentera
			money += 100;
			System.out.println("Le montant d'argent que j'ai a augmenté.");
		} else if (dice == 2) {
			//2ème ... la moitié de votre argent
			money /= 2;
			System.out.println("Votre argent a été réduit de moitié.");
		} else if (dice == 6) {
			//6 yeux ... obtenez des fruits
			String f = getFruit();
			System.out.println("des fruits(" + f + ")j'ai eu");
			fruits.add(f);
		} else {
			//A part ça ... rien ne se passe
			System.out.println("Rien ne s'est passé.");
		}
	}

	//Prenez un instantané
	public Memento createMemento() {
		Memento m = new Memento(money);
		Iterator it = fruits.iterator();
		while (it.hasNext()) {
			String f = (String) it.next();
			if (f.startsWith("Délicieux")) {
				//Ne gardez que de délicieux fruits
				m.addFruit(f);
			}
		}
		return m;
	}

	//Annuler
	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 = "Délicieux";
		}
		return prefix + fruitsname[random.nextInt(fruitsname.length)];
	}
}

4-2. Cours de souvenir

Une classe qui représente l'état de Geme.

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. Classe principale

Cette classe effectue le traitement principal. Faites avancer le jeu. Il enregistre également une instance de Memento et restaure l'état du joueur si nécessaire.

Main.java


import game.Gamer;
import game.Memento;

public class Main {

	public static void main(String[] args) {
		//La première possession est de 100
		Gamer gamer = new Gamer(100);
		//Sauvegarder l'état initial
		Memento memento = gamer.createMemento();

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

			//Faites avancer le jeu
			gamer.bet();

			System.out.println("L'argent que tu as" + gamer.getMoney() + "C'est devenu un cercle.");

			if (gamer.getMoney() > memento.getMoney()) {
				System.out.println("(Comme il a beaucoup augmenté, sauvegardons l'état actuel)");
				memento = gamer.createMemento();
			} else if (gamer.getMoney() < memento.getMoney() / 2) {
				System.out.println("(Il a beaucoup diminué, revenons donc à l'état précédent)");
				gamer.restoreMemento(memento);
			}
		}
	}
}

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

==== 0
Statut actuel:[money = 100, fruits = []]
des fruits(Délicieuse banane)j'ai eu
L'argent que j'ai est maintenant de 100 yens.
==== 1
Statut actuel:[money = 100, fruits = [Délicieuse banane]]
Le montant d'argent que j'ai a augmenté.
L'argent que j'ai est maintenant de 200 yens.
(Comme il a beaucoup augmenté, sauvegardons l'état actuel)
==== 2
Statut actuel:[money = 200, fruits = [Délicieuse banane]]
Rien ne s'est passé.
L'argent que j'ai est maintenant de 200 yens.
==== 3
Statut actuel:[money = 200, fruits = [Délicieuse banane]]
Le montant d'argent que j'ai a augmenté.
L'argent que j'ai est maintenant de 300 yens.
(Comme il a beaucoup augmenté, sauvegardons l'état actuel)
==== 4
Statut actuel:[money = 300, fruits = [Délicieuse banane]]
Rien ne s'est passé.
L'argent que j'ai est maintenant de 300 yens.
==== 5
Statut actuel:[money = 300, fruits = [Délicieuse banane]]
Votre argent a été réduit de moitié.
L'argent que j'ai est maintenant de 150 yens.
==== 6
Statut actuel:[money = 150, fruits = [Délicieuse banane]]
Rien ne s'est passé.
L'argent que j'ai est maintenant de 150 yens.
==== 7
Statut actuel:[money = 150, fruits = [Délicieuse banane]]
Le montant d'argent que j'ai a augmenté.
L'argent que j'ai est maintenant de 250 yens.
==== 8
Statut actuel:[money = 250, fruits = [Délicieuse banane]]
Votre argent a été réduit de moitié.
Le montant d'argent que j'ai est maintenant de 125 yens.
(Il a beaucoup diminué, revenons donc à l'état précédent)
==== 9
Statut actuel:[money = 300, fruits = [Délicieuse banane]]
Rien ne s'est passé.
L'argent que j'ai est maintenant de 300 yens.

5. Avantages

Le modèle Memento vous permet ** d'annuler, de refaire, de créer un historique de travail, d'enregistrer l'état actuel **, etc. Si vous souhaitez annuler, vous vous demandez peut-être si vous devez créer cette fonction dans la classe Gamer. Dans la classe Main, nous décidons "quand prendre un instantané" et "quand annuler" et occupons le rôle de Memento. D'autre part, dans la classe Gamer, vous ferez le travail de création du rôle de Memento et le travail de retour de votre propre état en utilisant le rôle donné de Memento. Vous pouvez voir que les rôles sont répartis de cette manière entre la classe Main et la classe Gamer. Si vous divisez les rôles comme ça,

--Je veux changer pour annuler en plusieurs étapes --Je souhaite enregistrer l'état actuel dans un fichier et annuler

Même si vous souhaitez effectuer la correction, vous n'avez pas besoin de modifier le rôle de joueur.

  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 ~ Memento ~
Motif de souvenir
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ État ~
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 ~ Commande ~
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
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 ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception C ++ (modèle TemplateMethod)
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 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)
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 stratégie
Modèle d'itérateur
Modèle d'adaptateur
Modèle de stratégie
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
Motif de façade
Modèle de visiteur
Modèle de pont
PrintObserver "Modèle de conception d'observateur: description et exemple d'implémentation"
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle de commande -