設計モード(14)chain of responsibility
責任を逃れる
誰かに頼んで、処理できるなら処理して、処理できないなら要求を他の人に渡します.
移行=自分の仕事に集中
クラスタイプ
📌Truble:障害が発生したクラスを示します.故障番号
📌Support:故障解決の抽象類
📌NoSupport:問題解決のための想定クラス(常に「処理しない」)
📌LimitSupport:障害解決の想定クラス(指定番号未満の障害解決)
📌ODSupport:故障解決の構想類(奇数故障解決)
📌プロフェッショナルサポート:トラブルシューティングの想定クラス(特定の番号のトラブルシューティング)
📌Main:チェーンの作成と障害動作のテストに使用されるクラス
Trouble class
public class Trouble{
private int number; //트러블 번호
public Trouble (int number) {this.number = number ;}//트러블의 생성
public int getNumber(){ return number; } //트러블 번호를 얻는다.
public String toString(){ //트러블 문자열 표현
return "[trouble"+ number +"]" ;
}
}
Support Class(親)
public abstract class Support{
private String name; // 이 트러블 해결자의 이름
🚨private Support next; //떠 넘기려는 곳 ; 다음 사람
public Support(String name){
this.name = name; //트러블 해결자의 생성
}
public Support setNext(Support next){
this.next=next; //떠넘기려는 곳을 설정
return next;
}
🚨public final void support(Trouble touble){ //트러블 해결 수순
if(resolve(trouble)){
done(trouble); //해결
}else if(next != null){
next.support(trouble);
}else {
fail(trouble); //미해결
}
}
public String toString(){ //문자열 표현
return "[" +name + "]";
}
🚨protected abstract boolean resolve(Trouble trouble); //(구체적 클래스)자식들이 구체적으로 구현
protected void done (Trouble trouble){ //해결
System.out.println(trouble+"is resolved by" +this.toString +".");
}
protected void fail(Trouble trouble){ //미해결
System.out.println(trouble+"cannot be resolved.");
}
}
サブクラス
📌 NoSupport class
public class NoSupport extends Support{
public NoSupport(String name){
super(name);
}
protected boolean resolve(Trouble trouble){ //해결 메소드
return false; //항상 false 반환
}
}
📌 LimitSupport class
public class LimitSupport extends Support{
private int limit; // 이 번호 미만이면 해결 가능
public LimitSupport (String name, int limit){
super(name);
this.limit=limit;
}
🚨protected boolean resolve(Trouble touble){
if( trouble.getNumber()<limit){
return true;
} else{
retrun false;
}
}
}
📌 OddSupport class
public class OddSupport extends Support{
public OddSupport(String name){
super (name);
}
🚨protected boolean resolve(Trouble trouble){
if(trouble.getNumber()%2==1){
return true;
}else {
return false;
}
}
}
📌 SpecialSupport class
public class SpecialSupport extends Support{
private int number; // number; 이 번호만 해결가능
public SpecialSupport(String name, int number){
super(name);
this.number=number;
}
🚨protected boolean resolve(Trouble trouble){
if (trouble.getName()==number;{
return true;
} else {
return false;
}
}
}
📌 Main class
public class Main{
public static void main(String[] args){
Support alice = new NoSupport("Alilce");
Support bob = new LimitSupport("Bob",100);
Support charlie = new SpecialSupport("charlie",429);
Support diana = new LimitSupport("Diana",200);
Support elmo= new OddSupport("Elmo");
Support fred= new LimitSupport("Fred",300);
//사슬의 형성
alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);
//트러블의 발생
for(int i=0; i<500; i+=33){
alice.support(new Trouble(i);
}
}
}
Reference
この問題について(設計モード(14)chain of responsibility), 我々は、より多くの情報をここで見つけました https://velog.io/@plussell/디자인패턴-chain-of-Responsibilityテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol