設計モード(14)chain of responsibility


責任を逃れる


誰かに頼んで、処理できるなら処理して、処理できないなら要求を他の人に渡します.
移行=自分の仕事に集中

クラスタイプ


📌Truble:障害が発生したクラスを示します.故障番号
📌Support:故障解決の抽象類
📌NoSupport:問題解決のための想定クラス(常に「処理しない」)
📌LimitSupport:障害解決の想定クラス(指定番号未満の障害解決)
📌ODSupport:故障解決の構想類(奇数故障解決)
📌プロフェッショナルサポート:トラブルシューティングの想定クラス(特定の番号のトラブルシューティング)
📌Main:チェーンの作成と障害動作のテストに使用されるクラス

Trouble class

  • 号:故障番号
  • getNumber:メソッドから障害番号を取得します.
  • 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(親)

  • の問題を解決するチェーンを作成するための抽象クラス.
  • nextフィールド転送先を指定する
  • setNextメソッド
  • が設定されています.
  • 解析法は、サブクラスで実装する場所を定義する抽象的な方法
  • である.
  • 解析メソッド戻り値true:要求済み//flase:未要求->次へ転送
  • 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

  • がサポートするサブクラス
  • 解析法は常にfalse
  • を返す
  • つまり何もしないクラス
  • public class NoSupport extends Support{
    	public NoSupport(String name){
        	super(name);   
        } 
        protected boolean resolve(Trouble trouble){ //해결 메소드 
        	return false;   //항상 false 반환 
        } 
    }

    📌 LimitSupport class

  • limitで番号が指定されていない障害を解決する
  • 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);
    	}                   
     }
    }