[JAVA] Modèle de stratégie

Quel est le modèle de stratégie?

Chaque programme est écrit pour résoudre un problème. Et certains algorithmes sont mis en œuvre pour résoudre le problème. Dans le modèle Stratégie, la partie qui implémente l'algorithme peut être échangée. Un modèle qui permet de changer d'algorithme facilement et de résoudre le même problème différemment.

Le rôle de la stratégie

Le rôle qui définit l'interface d'utilisation de la stratégie.

package strategy;

public interface Strategy {
	//Décidez quoi faire ensuite
	public abstract Hand nexHand();
	//Découvrez si vous avez gagné avec le dernier coup
	public abstract void study(boolean win);
}

Le rôle de la stratégie concrète

Le rôle qui implémente réellement l'interface du rôle Stratégie. Ici, la stratégie (stratégie, méthode, politique, algorithme) est en fait programmée.

package strategy;

import java.util.Random;

public class WinningStrategy implements Strategy{
	private Random random;
	private boolean won = false;
	private Hand prevHand;

	public WinningStrategy(int seed) {
		random = new Random(seed);
	}

	/**
	 *Si vous gagnez la dernière fois, faites le même coup, si vous perdez, décidez le coup au hasard
	 */
	@Override
	public Hand nextHand() {
		if (!won) {
			prevHand = Hand.getHand(random.nextInt(3));
		}
		return prevHand;
	}

	@Override
	public void study(boolean win) {
		won = win;
	}
}
package strategy;

import java.util.Random;

public class ProbStrategy implements Strategy {
	private Random random;
	private int prevHandValue = 0;
	private int currentHandValue = 0;
	//Tableau de calcul des probabilités reflétant les victoires et les pertes passées
	//[La dernière main][Mains à éteindre cette fois]
	private int[][] history = {
			{1,1,1,},
			{1,1,1,},
			{1,1,1,},
	};

	public ProbStrategy(int seed) {
		random = new Random(seed);
	}

	/**
	 *Calculer avec probabilité à partir de la valeur de l'histoire
	 *Par exemple, histoire[0][0]La valeur de est 3, histoire[0][1]La valeur de est 5, histoire[0][2]Si la valeur de est 7
	 *Goo, choki, par 3:5:Déterminez le coup suivant comme 7.
	 *0 ou plus et moins de 15(15 est 3+5+Valeur totale de 7)Obtenez la valeur aléatoire de
	 *Goo si 0 ou plus et moins de 3
	 *Choki si 3 ou plus et moins de 8
	 *Par si 8 ou plus et moins de 15
	 *À
	 */
	@Override
	public Hand nextHand() {
		int bet = random.nextInt(getSum(currentHandValue));
		int handValue = 0;
		if (bet < history[currentHandValue][0]) {
			handValue = 0;
		} else if (bet < history[currentHandValue][0] + history[currentHandValue][1]) {
			handValue = 1;
		} else {
			handValue = 2;
		}

		prevHandValue = currentHandValue;
		currentHandValue = handValue;
		return Hand.getHand(handValue);
	}

	private int getSum(int hv) {
		int sum = 0;
		for (int i = 0; i < 3; i++) {
			sum += history[hv][i];
		}
		return sum;
	}

	/**
	 *Mettre à jour le contenu du champ d'historique en fonction de la victoire ou de la perte de la main retournée par la méthode nextHand
	 *
	 */
	@Override
	public void study(boolean win) {
		if (win) {
			history[prevHandValue][currentHandValue]++;
		} else {
			history[prevHandValue][(currentHandValue + 1) % 3]++;
			history[prevHandValue][(currentHandValue + 2) % 3]++;
		}
	}
}

Le rôle du contexte

Un rôle qui utilise le rôle Stratégie. Ayez une instance du rôle ConcreateStrategy et utilisez-la si nécessaire. C'est l'interface qui joue le rôle de stratégie.

package strategy;

public class Player {
	private String name;
	private Strategy strategy;
	private int winCount;
	private int loseCount;
	private int gameCount;

	public Player(String name, Strategy strategy) {
		this.name = name;
		this.strategy = strategy;
	}

	public Hand nextHand() {
		//C'est votre "stratégie" qui décide de votre prochain mouvement
		return strategy.nextHand();
	}

	public void win() {
		//Changer l'état interne de la stratégie
		strategy.study(true);
		winCount++;
		gameCount++;
	}

	public void lose() {
		//Changer l'état interne de la stratégie
		strategy.study(false);
		loseCount++;
		gameCount++;
	}

	public void even() {
		gameCount++;
	}

	public String toString() {
		return "[" + name + ":" + gameCount + " games, " + winCount + " win, " +
	loseCount + " lose" + "]";
	}
}

Votre interlocuteur

package strategy;

public class Main {
	public static void main(String[] args) {
		if (args.length != 2) {
			System.out.println("Usage: java Main randmeseed1 randomeseed2");
			System.out.println("Example: java Main 314 15");
			System.exit(0);
		}

		int seed1 = Integer.parseInt(args[0]);
		int seed2 = Integer.parseInt(args[1]);
		Player p1 = new Player("Jiro", new WinningStrategy(seed1));
		Player p2 = new Player("Taro", new ProbStrategy(seed2));
		for (int i = 0; i < 10000; i++) {
			Hand nexHand1 = p1.nextHand();
			Hand nexHand2 = p2.nextHand();
			if (nexHand1.isStrongerThan(nexHand2)) {
				System.out.println("Winner:" + p1);
				p1.win();
				p2.lose();
			} else if (nexHand2.isStrongerThan(nexHand1)) {
				System.out.println("Winner:" + p2);
				p1.lose();
				p2.win();
			} else {
				System.out.println("Even…");
				p1.even();
				p2.even();
			}
		}

		System.out.println("Total result:");
		System.out.println(p1);
		System.out.println(p2);

	}
}

Résultat d'exécution

スクリーンショット 2020-09-08 13.43.45.png

https://github.com/aki0207/strategy

Je l'ai utilisé comme référence. Édition révisée augmentée Introduction aux modèles de conception appris en langage Java

Recommended Posts

Modèle de stratégie
Modèle de stratégie
Modèle de conception ~ Stratégie ~
Modèle de stratégie Enum en Java
Modèle de prototype
Motif de souvenir
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 constructeur
Modèle d'itérateur
Modèle de visiteur
Modèle d'adaptateur
Modèle de proxy
Motif composite
Motif singleton
Motif singleton
Modèle de prototype
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
J'ai étudié le modèle d'état et le modèle de stratégie
modèle d'usine abstrait
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
modèle de rappel java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de méthode d'usine
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (2): constructeur
Modèle de conception (1): AbstractFactory
[Java] Motif singleton
Modèle de conception ~ Commande ~
Modèle d'usine abstraite
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de méthode de modèle
Modèle de conception ~ Décorateur ~
Modèle de modèle de méthode
Modèle de conception ~ Interprète ~
Modèle de méthode d'usine
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
[Java] Modèle d'adaptateur
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~