職責チェーンパターンChain of Responsibility Pattern

4115 ワード

一、職責チェーンモードChain of Responsibility(CoR)モードとは、職責チェーンモードまたは職責チェーンモードとも呼ばれ、行動モードの一つであり、このモードはそれぞれ異なる職責を担うクラスのオブジェクトを構築して一つのタスクを共同で完成させ、これらのクラスのオブジェクト間はチェーンのように密接につながっているため、職責チェーンモードと呼ばれている.二、職責チェーンモードの応用シーン例1:例えば、顧客Clientはa,b,c,dの4つの部分を含むタスクを完成しなければならない.まずクライアントClientはAにタスクを渡し、Aはa部分を完成した後、Bにタスクを渡し、Bはb部分を完成し、...、Dがd部分を完了するまで.例2:例えば政府の一部の仕事は、県政府が自分で処理できる部分を先に完成し、処理できない部分は省政府に渡し、省政府は自分の職責範囲内の部分を完成し、処理できない部分は中央政府に渡し、中央政府は最後にこの仕事を完成する.例3:ソフトウェアウィンドウのメッセージ伝播.例4:SERVLET容器のフィルタ(Filter)フレームで実現する.三、職責チェーンモデルの基本条件Chain of Responsibilityモデルを実現するには、このモデルの基本条件を満たす必要がある:1.オブジェクトチェーンの組織.タスクのすべての職責実行オブジェクトをチェーン形式で組織する必要があります.2.メッセージまたはリクエストの転送.メッセージまたはリクエストをオブジェクトチェーンに沿って渡して、オブジェクトチェーン内のオブジェクトを処理する機会を得ます.3.オブジェクトチェーンにあるオブジェクトの役割の割り当て.異なるオブジェクトは異なる職責を果たす.4.タスクの完了.オブジェクトチェーンの最後にあるオブジェクトは、タスクを終了し、メッセージまたはリクエストの転送を停止します.四、職責チェーンモデルの構造五、職責チェーンモデルの役割と職責Handler処理クラスの抽象親.concreteHandlerの具体的な処理クラス.六、職責チェーンモデルの長所と短所:1.責任の分担.各クラスは、自分の処理すべき作業(次のオブジェクトに渡すべきでない作業)を処理し、各種類の責任範囲を明確にし、クラスの最小パッケージ原則に合致する必要があります.2.必要に応じてワークフローを自由に組み合わせることができます.ワークフローが変更されると、オブジェクトチェーンを再割り当てすることで、新しいワークフローに適応できます.3.クラスとクラスの間は緩やかな結合の形で組織することができる.欠点:
処理時にオブジェクト間でチェーン形式でメッセージを伝達するため,実装方式によっては処理の速度に影響を及ぼす可能性がある.
未運用モード前のコード:
CarHandler.java
public abstract class CarHandler { 
	 
    public abstract void handlerCar(); 
}

CarHeadHandler.java
public class CarHeadHandler extends CarHandler{ 
	 
    public void handlerCar() { 
        System.out.println("    "); 
    } 
 
}

CarBodyHandler.java
public class CarBodyHandler extends CarHandler { 
	 
    public void handlerCar() { 
        System.out.println("    "); 
    } 
 
}

CarTailHandler.java
public class CarTailHandler extends CarHandler{ 
	 
    public void handlerCar() { 
        System.out.println("    "); 
    } 
 
}

MainClass.java
public class MainClass { 
    public static void main(String[] args) { 
        CarHandler headH = new CarHeadHandler(); 
        CarHandler bodyH = new CarBodyHandler(); 
        CarHandler tailH = new CarTailHandler(); 
 
        headH.handlerCar(); 
        bodyH.handlerCar(); 
        tailH.handlerCar(); 
    } 
}




職責チェーンモデルを使用したコード:
CarHandler.java
package com.ibeifeng.ex2; 

public abstract class CarHandler { 
    protected CarHandler carHandler; 
 
    public CarHandler setNextHandler(CarHandler carHandler) { 
        this.carHandler = carHandler; 
        return this.carHandler; 
    } 
 
    public abstract void handlerCar(); 
}
CarHeadHandler.java
package com.ibeifeng.ex2; 

public class CarHeadHandler extends CarHandler{ 
 
    public void handlerCar() { 
        System.out.println("    "); 
        if(this.carHandler != null) { 
            this.carHandler.handlerCar(); 
        } 
    } 
 
}
CarBodyHandler.java
package com.ibeifeng.ex2; 

public class CarBodyHandler extends CarHandler { 
 
    public void handlerCar() { 
        System.out.println("    "); 
        if(this.carHandler != null) { 
            this.carHandler.handlerCar(); 
        } 
    } 
 
}
CarTailHandler.java
package com.ibeifeng.ex2; 

public class CarTailHandler extends CarHandler{ 
 
    public void handlerCar() { 
        System.out.println("    "); 
        if(this.carHandler != null) { 
            this.carHandler.handlerCar(); 
        } 
    } 
 
}
MainClass.java
package com.ibeifeng.ex2; 

public class MainClass { 
    public static void main(String[] args) { 
        CarHandler headH = new CarHeadHandler(); 
        CarHandler bodyH = new CarBodyHandler(); 
        CarHandler tailH = new CarTailHandler(); 
 
        //         ,     -->  -->   
        headH.setNextHandler(bodyH); 
        bodyH.setNextHandler(tailH); 
 
        //              
        headH.handlerCar(); 
 
        System.out.println("---------------"); 
 
        //    ,     -->  --   
        bodyH.setNextHandler(headH); 
        headH.setNextHandler(tailH); 
        bodyH.handlerCar(); 
 
        //     
        bodyH.setNextHandler(headH).setNextHandler(tailH); 
        bodyH.handlerCar(); 
 
 
    } 
}