CoRモード



 
CoR(Chain of Responsibility)すなわち職責チェーン設計モード:要求の送信者と受信者との結合関係を回避するために、複数のオブジェクトが要求(Request)を処理する機会を与える.これらのオブジェクトをチェーンに接続し、オブジェクトが彼を処理するまで、このチェーンに沿ってリクエストを渡します.ロールチェーン設計モードには、(1)要求(Request):パッケージング要求情報(2)プロセッサ(Handler):処理要求(Request)の3つのロールがあります.1つの特定のプロセッサは、伝達された要求を処理できない場合は、一般的に1つの要求のみを処理します.これにより、リクエストは職責チェーンの次のプロセッサ(後続プロセッサsuccessor)に渡されます.(3)クライアント(Client):送信要求定義はこれ以上言わず,実装を直接見る.以下は従来のCoR実装である:1抽象要求を表すインタフェース(Request)
 
public interface Request{
    //......
} 

2,Requestインタフェースを実装する実装クラス,HelpRequest,PrintRequest,SaveRequestはテキストエディタがあると仮定し,ユーザインタフェースには3つのボタンHelpがあり,PrintとSave HelpRequestはユーザがHelpボタンをクリックしたときに生じるヘルプ要求を表す.
PrintRequestは、ユーザがPrintボタンをクリックしたときに生じる印刷要求を表し、SaveRequestは、ユーザがSaveボタンをクリックしたときに生じる保存要求を表す.
//    
public class HelpRequest implements Request{
    //......
}
//    
public class PrintRequest implements Request{
    //......
}
//    
public class SaveRequest implements Request{
    //......
}
 
3,抽象プロセッサを表すインタフェースHandler:
public interface Handler{
    void handleRequest(Request request);
}

 
4,実装プロセッサインタフェースの実装クラスHelpHandler,PrintHandler,SaveHandler:HelpHandler処理支援要求(HelpRequest)
public class HelpHandler implements Handler{
    //     
    private Handler successor;
    public HelpHandler(Handler successor){this.successor = successor;}
    public void handleRequest(Request request) {
        if(request instanceof HelpRequest){
             System.out.println("HelpHandler handle " +request.getClass().getSimpleName());
             // handle request
        }else{
            System.out.println("PrintHandler can't handle "+request.getClass().getSimpleName());
            if(successor != null)
                successor.handleRequest(request);
        }
    }
}

 
PrintHandler印刷要求の処理(PrintRequest)
public class PrintHandler implements Handler{
    //     
    private Handler successor;
    public PrintHandler(Handler successor){this.successor = successor;}
    public void handleRequest(Request request) {
        if(request instanceof PrintRequest){
            System.out.println("PrintHandler handle "+request.getClass().getSimpleName());
            // handle request
        }else{
            System.out.println("PrintHandler can't handle "+request.getClass().getSimpleName());
           if(successor != null)
                successor.handleRequest(request);
        }
    }
}

 
SaveHandler処理保存要求(SaveRequest)
 
 
public class SaveHandler implements Handler{
    //     
    private Handler successor;
    public SaveHandler(Handler successor){this.successor = successor;}
    public void handleRequest(Request request) {
        if(request instanceof SaveRequest){
            System.out.println("SaveHandler handle "+request.getClass().getSimpleName());
            // handle request
        }else{
            System.out.println("SaveHandler can't handle "+request.getClass().getSimpleName());
            if(successor != null)
                successor.handleRequest(request);
        }
    }
}
 
5,クライアントClientクラス
public class Client{
    public static void main(String[] args){
        Handler handler1 = new HelpHandler(null);
        Handler handler2 = new PrintHandler(handler1);
        Handler handler3 = new SaveHandler(handler2);

        handler3.handleRequest(new HelpRequest());
        handler3.handleRequest(new PrintRequest());
        handler3.handleRequest(new SaveRequest());
    }
}

 
Clientクラスの出力を実行するには、SaveHandler can't handle HelpRequestPrintHandler can't handle HelpRequestHelpHandler handle HelpRequest SaveHandler can't handle PrintRequestPrintHandler handle PrintRequest SaveHandler SaveRequest関連リンク:http://www.iteye.com/topic/411222 CoRモード(別)
 
-----------------------------------------------------
 
抽象クラスでも良いのですが、handleRequestの(1)このプロセッサがこのリクエストを処理できるかどうかと(2)対応するリクエストを処理できるかどうかという2つの機能を分離し、抽象メソッドとして定義してサブクラス(具体的なプロセッサ)に実現させる
 
public abstract class AbstractHandler implements Handler {    
    protected Handler successor;    
    public AbstractHandler(Handler successor) {    
        this.successor = successor;    
    }    
//finalと定義し、布団類はを継承できない
    public final void handleRequest(Request request) {    
        if (canHandleRequest(request)) {    
            handleRequestMyself(request);  
        } else {    
            if (successor != null)    
                successor.handleRequest(request);    
        }    
    }    
//このプロセッサは要求全体を処理できるかどうか
    protected abstract boolean canHandleRequest(Request request);  
//対応要求の処理    protected abstract void handleRequestMyself(Request request);  
}   
 -----------------------------------------------------
 
PipeLine + Value
lishuaibtは
実は純粋な責任チェーンモデル私の理解は、責任逃れのモデルであり、責任を負うモジュールがこの要求を受信し、この要求を処理することを知っている.このような状況は確かにあまり多くないでしょう.(個人的にはね).pipelineという概念は、従来のturbineフレームワーク(非常に優れたMVCフレームワーク)で使われていた.その大まかなパターンと概念は以下の通りである:PipeLineはサーブレットのFilterChainの概念に似ており、valveはFilterに似ている.このPipeLineの各Valveノードを流れるリクエストであり、このノードは純粋な責任チェーンモードのように、責任を押し下げるのではなく、このリクエストに対して一定の処理を行う.対応した処理をした後、処理後の要求を次のValveに渡して処理したいのです.例を挙げると、一度サーブレットを要求する過程で、CharSetの設定、権限検証、URLの解析など、すべての要求に必要な処理がある場合があります.これらの処理は要求のChainを構成し、すべての要求はこれらの処理を経て、次の具体的な業務処理を行うことができます.この时、これらの共通の処理を抽象化してpipelineを作ることができて、このpipelineはvalveノードで构成されたことがあります...差が少ないからそういう意味でしょう...文字で形容するのは確かに言いにくい.