Voici un résumé du ** modèle de chaîne de responsabilité ** dans le modèle de conception du GoF.
C'est un programme que l'un des supports résoudra le problème que vous avez saisi.
Cette classe représente le problème qui s'est produit.
Trouble.java
public class Trouble {
//Numéro de problème
private int number;
public Trouble(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public String toString() {
return "[Trouble " + number + "]";
}
}
Une classe abstraite qui résout les problèmes.
Support.java
public abstract class Support {
//Le nom de cet outil de dépannage
private String name;
//Tournez la baignoire
private Support next;
public Support(String name) {
this.name = name;
}
public Support setNext(Support next) {
this.next = next;
return next;
}
//Procédure de résolution des problèmes
public void support(Trouble trouble) {
if (resolve(trouble)) {
done(trouble);
} else if (next != null) {
next.support(trouble);
} else {
fail(trouble);
}
}
public String toString() {
return "[" + name + "]";
}
//Méthode de solution
protected abstract boolean resolve(Trouble trouble);
//Solution
protected void done(Trouble trouble) {
System.out.println(trouble + " is resolved by " + this + ".");
}
//non résolu
protected void fail(Trouble trouble) {
System.out.println(trouble + " cannot be resolved.");
}
}
C'est une classe concrète qui résout les problèmes. Ne traite pas toujours.
NoSupport.java
public class NoSupport extends Support {
public NoSupport(String name) {
super(name);
}
protected boolean resolve(Trouble trouble) {
return false;
}
}
C'est une classe concrète qui résout les problèmes. Vous pouvez résoudre des problèmes avec des nombres inférieurs au nombre spécifié.
LimitSupport.java
public class LimitSupport extends Support {
private int limit;
public LimitSupport(String name, int limit) {
super(name);
this.limit = limit;
}
//Peut être résolu si inférieur à la limite
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() < limit) {
return true;
} else {
return false;
}
}
}
C'est une classe concrète qui résout les problèmes. Vous pouvez résoudre le problème des nombres impairs.
OddSupport.java
public class OddSupport extends Support {
public OddSupport(String name) {
super(name);
}
//Peut résoudre des problèmes avec des nombres impairs
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() % 2 == 1) {
return true;
} else {
return false;
}
}
}
C'est une classe concrète qui résout les problèmes. Vous pouvez résoudre le problème d'un numéro spécifique.
SpecialSupport.java
public class SpecialSupport extends Support {
private int number;
public SpecialSupport(String name, int number) {
super(name);
this.number = number;
}
//Peut être résolu si nombre
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() == number) {
return true;
} else {
return false;
}
}
}
Cette classe effectue le traitement principal.
Main.java
public class Main {
public static void main(String[] args) {
Support alice = new NoSupport("Alice");
Support bob = new LimitSupport("Bob", 100);
Support charlie = new SpecialSupport("Charlie", 429);
Support diana = new LimitSupport("Diana", 200);
Support elmo = new OddSupport("Elmo");
alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo);
//Divers problèmes surviennent
for (int i = 0; i < 500; i += 33) {
alice.support(new Trouble(i));
}
}
}
[Trouble 0] is resolved by [Diana].
[Trouble 33] is resolved by [Diana].
[Trouble 66] is resolved by [Diana].
[Trouble 99] is resolved by [Diana].
[Trouble 132] is resolved by [Diana].
[Trouble 165] is resolved by [Diana].
[Trouble 198] is resolved by [Diana].
[Trouble 231] is resolved by [Elmo].
[Trouble 264] cannot be resolved.
[Trouble 297] is resolved by [Elmo].
[Trouble 330] cannot be resolved.
[Trouble 363] is resolved by [Elmo].
[Trouble 396] cannot be resolved.
[Trouble 429] is resolved by [Charlie].
[Trouble 462] cannot be resolved.
[Trouble 495] is resolved by [Elmo].
Le point du modèle de chaîne de responsabilité est qu'il ** relie vaguement le «demandeur (principal)» et le «demandeur (support)» **. Lorsque le "demandeur (principal)" fait une demande à la première personne, la demande circule dans la chaîne et la demande est traitée par la personne appropriée. Sans le modèle de chaîne de responsabilité, quelqu'un aurait besoin de savoir que cette demande devrait être traitée par cette personne. Si cette connaissance est donnée au "demandeur (principal)", l'indépendance en tant que partie sera altérée. Veuillez noter que le modèle ** Chaîne de responsabilité est plus flexible, mais il sera plus lent en raison des divagations **. Si la vitesse de traitement est très importante, vous ne devez pas utiliser le modèle Chaîne de responsabilité. (Ne pas écrire dans la colonne du mérite! W)
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