J'ai implémenté le modèle d'état au travail, donc je vais le laisser dans Qiita. Le langage utilisé était Java 8, mais la plupart des langages devraient pouvoir l'implémenter de la même manière.
Quand j'ai regardé en arrière pour la première fois en un an, je me suis rendu compte que la distinction entre État et Stratégie n'était pas correctement faite.
Après avoir appris les machines d'état, j'ai pu comprendre pourquoi elles sont appelées modèles d'état. Dans l'article suivant, je me suis rendu compte que la dénomination de l'échantillon que je pensais légèrement à l'époque n'était pas tout à fait appropriée. Si vous vous appelez le modèle State, chaque objet State doit renvoyer l'objet State après la transition d'état.
** Le contenu du sujet principal de l'article suivant a été créé en convertissant tout l'état de l'article précédent en Stratégie. Je vais laisser le précédent pour le moment **
Lorsque vous utilisez le modèle de stratégie, vous avez besoin d'un objet Stratégie qui représente chaque processus et d'un objet qui détermine la stratégie à générer. Le processus de décision de ce qu'il faut générer a été placé dans Factory.
//Interface de stratégie
public interface Strategy{
void doSomething();
}
//Mise en œuvre de la stratégie 1
public class StrategyImpl1 implements implements Strategy {
public void doSomething(){
System.out.println("Plein de traitements spécifiques à Strategy1");
}
}
//Mise en œuvre de la stratégie 2
public class StrategyImpl2 implements implements Strategy {
public void doSomething(){
System.out.println("Plein de traitements spécifiques à Strategy2");
}
}
Cela n'a pas beaucoup de sens de préparer une stratégie.
//Quel est l'avantage d'écrire ce code?
Strategy strategy1 = new StrategyImpl1();
Strategy strategy2 = new StrategyImpl2();
En fait, vous avez également besoin d'une classe qui effectue un traitement de branche conditionnel qui gère chaque processus.
public class Factory{
//Je pense que c'est statique
public Strategy create(SomeCondition sc){
if (sc.something1) {
//En fait, il faut environ deux étapes pour créer un objet.
return new StateImpl1();
} else if(sc.something2) {
return new StateImpl2();
}
}
}
Par conséquent, l'appelant peut écrire:
Factory factory = new Factory();
for(SomeCondition sc: List<SomeCondition> scs) {
Strategy strategy = factory.create(sc);
strategy.doSomething();
}
Dans cet exemple, l'instruction switch est suffisante, donc cela n'a pas beaucoup de sens, cela la complique inutilement. Lorsque le branchement conditionnel est désagréablement compliqué et que de nombreux processus légèrement différents doivent être exécutés à la suite du jugement, les perspectives deviennent considérablement meilleures (maintenant).
Il est difficile d'augmenter le nombre de fichiers de classe, mais Les humains ne peuvent pas penser à trop de choses ou à des choses compliquées à la fois, nous les divisons donc en classes pour réduire la quantité que nous devons comprendre à la fois.
Lorsque vous utilisez le modèle State, vous avez besoin d'un objet State qui représente chaque état et d'un objet qui détermine l'état à générer. Le processus de décision de ce qu'il faut générer a été placé dans Factory.
//Interface d'état
public interface State{
void doSomething();
}
//État de la mise en œuvre 1
public class StateImpl1 implements implements State {
public void doSomething(){
System.out.println("Traitement spécifique complet de l'État 1");
}
}
//État de la mise en œuvre 2
public class StateImpl2 implements implements State {
public void doSomething(){
System.out.println("Traitement spécifique Full of State 2");
}
}
Préparer un État n'a pas beaucoup de sens.
//Quel est l'avantage d'écrire ce code?
State state = new StateImpl1();
State state = new StateImpl2();
En fait, vous avez également besoin d'une classe qui effectue un branchement conditionnel pour gérer l'état.
public class Factory{
//Je pense que c'est statique
public State create(SomeCondition sc){
if (sc.something1) {
//En fait, il faut environ deux étapes pour créer un objet.
return new StateImpl1();
} else if(sc.something2) {
return new StateImpl2();
}
}
}
Par conséquent, l'appelant peut écrire:
Factory factory = new Factory();
for(SomeCondition sc: List<SomeCondition> scs) {
State state = factory.create(sc);
state.doSomething();
}
Recommended Posts