Hier ist eine Zusammenfassung des ** Chain of Responsibility-Musters ** im GoF-Entwurfsmuster.
Es ist ein Programm, mit dem einer der Support die von Ihnen eingegebenen Probleme löst.
Diese Klasse repräsentiert die aufgetretenen Probleme.
Trouble.java
public class Trouble {
//Störungsnummer
private int number;
public Trouble(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public String toString() {
return "[Trouble " + number + "]";
}
}
Eine abstrakte Klasse, die Probleme löst.
Support.java
public abstract class Support {
//Der Name dieser Fehlerbehebung
private String name;
//Drehen Sie die Wanne
private Support next;
public Support(String name) {
this.name = name;
}
public Support setNext(Support next) {
this.next = next;
return next;
}
//Verfahren zur Fehlerbehebung
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 + "]";
}
//Lösungsmethode
protected abstract boolean resolve(Trouble trouble);
//Lösung
protected void done(Trouble trouble) {
System.out.println(trouble + " is resolved by " + this + ".");
}
//ungelöst
protected void fail(Trouble trouble) {
System.out.println(trouble + " cannot be resolved.");
}
}
Dies ist eine konkrete Klasse, die Probleme löst. Wird nicht immer verarbeitet.
NoSupport.java
public class NoSupport extends Support {
public NoSupport(String name) {
super(name);
}
protected boolean resolve(Trouble trouble) {
return false;
}
}
Dies ist eine konkrete Klasse, die Probleme löst. Sie können Probleme mit Zahlen lösen, die kleiner als die angegebene Zahl sind.
LimitSupport.java
public class LimitSupport extends Support {
private int limit;
public LimitSupport(String name, int limit) {
super(name);
this.limit = limit;
}
//Kann gelöst werden, wenn weniger als das Limit
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() < limit) {
return true;
} else {
return false;
}
}
}
Dies ist eine konkrete Klasse, die Probleme löst. Sie können das Problem ungerader Zahlen lösen.
OddSupport.java
public class OddSupport extends Support {
public OddSupport(String name) {
super(name);
}
//Kann Probleme mit ungeraden Zahlen lösen
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() % 2 == 1) {
return true;
} else {
return false;
}
}
}
Dies ist eine konkrete Klasse, die Probleme löst. Sie können das Problem einer bestimmten Nummer lösen.
SpecialSupport.java
public class SpecialSupport extends Support {
private int number;
public SpecialSupport(String name, int number) {
super(name);
this.number = number;
}
//Kann gelöst werden, wenn Nummer
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() == number) {
return true;
} else {
return false;
}
}
}
Diese Klasse führt die Hauptverarbeitung durch.
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);
//Es treten verschiedene Probleme auf
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].
Der Punkt des Chain of Responsibility-Musters besteht darin, dass es den "Anforderer (Main)" und den "Anforderer (Support)" ** lose miteinander verbindet. Wenn der "Anforderer (Haupt)" eine Anfrage an die erste Person stellt, fließt die Anfrage durch die Kette und die Anfrage wird von der entsprechenden Person verarbeitet. Ohne das Muster der Verantwortungskette müsste jemand wissen, dass diese Anfrage von dieser Person bearbeitet werden sollte. Wenn dieses Wissen an den "Anforderer (Main)" weitergegeben wird, wird die Unabhängigkeit als Teil beeinträchtigt. Bitte beachten Sie, dass das Muster der ** Verantwortungskette flexibler ist, jedoch aufgrund des Streifens langsamer wird **. Wenn die Verarbeitungsgeschwindigkeit sehr wichtig ist, sollten Sie das Muster der Verantwortungskette nicht verwenden. (Nicht in die Verdienstspalte schreiben! W)
Dieser Artikel und das Beispielprogramm wurden basierend auf den folgenden Büchern erstellt.
Es war sehr leicht zu verstehen und ich habe viel gelernt. Vielen Dank. Die detaillierten Erklärungen der Entwurfsmuster und Beispielprogramme sind geschrieben. Schauen Sie sich also auch die Bücher an.