[JAVA] Modèle de conception ~ Chaîne de responsabilité ~

1.Tout d'abord

Voici un résumé du ** modèle de chaîne de responsabilité ** dans le modèle de conception du GoF.

2. Quel est le modèle de la chaîne de responsabilité?

3. Exemple de diagramme de classes

ChainofResponsibility.PNG

4. Exemple de programme

C'est un programme que l'un des supports résoudra le problème que vous avez saisi.

4-1. Classe de problèmes

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 + "]";
	}
}

4-2. Classe d'assistance

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.");
	}
}

4-3. Classe NoSupport

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;
	}
}

4-4. Classe LimitSupport

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;
		}
	}
}

4-5. Classe OddSupport

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;
		}
	}
}

4-6. Classe SpecialSupport

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;
		}
	}
}

4-7. Classe principale

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));
		}
	}
}

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

[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].

5. Avantages

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)

  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 ~ Chaîne de responsabilité ~
Modèle de chaîne de responsabilité
Modèle de chaîne de responsabilité
Java8 Lambda Expression & Stream Design Pattern Repenser - Modèle de chaîne de responsabilité -
Exemple d'application du modèle de conception (n ° 1)
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
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 (1): AbstractFactory
Modèle de conception ~ Commande ~
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 conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
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
Quel homme aimez-vous? Identifier les cibles d'amour en utilisant le modèle de la chaîne de responsabilité
[Design pattern] Bibliothèque de base Java
[Java] Résumé des modèles de conception
Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception mâché C #: TemplateMethod
Modèle de conception Java pour débutant (modèle de méthode d'usine)