Androidイベント配信プロセス(一)責任チェーン設計モデル

8509 ワード

責任チェーン設計モデル
簡単な紹介
Viewのイベント配信メカニズムは、責任チェーン(Chain of Responsibility)設計モデルの典型的な応用であり、他の古典的な応用シーンには、JavaWebのフィルタ、ブロック、サーブレットの要求応答チェーンがある.okhttpオープンソースライブラリでも,ネットワーク層,アプリケーション層においてブロックを用いて階層的デカップリングを行い,ネットワーク層の構成と開発を簡単で優雅にする.
ケーススタディ
設計モードは抽象的な概念ではなく、プログラミングの実践の中である典型的な問題を解決するための典型的なモデルをまとめた.デザインモデルは実戦のために生まれたと言える.ここで言う責任チェーン設計モデルも例外ではありません.次に、実際の応用シーンを見てみましょう.
従業員の休暇プロセス、普通の従業員の3日以内の休暇申請、TeamLeaderは直接承認して通過することができます;3日から5日の休暇申請はTeamLeaderの承認が通過した後、技術総監(CTO)が承認することができる.5日から10日の休暇申請は技術総監(CTO)の承認を得なければならない.10日以上の休暇申請は、部門マネージャー(PV)と社長(CEO)の承認を得てから正常に休暇を取らなければならない.従業員の休暇申請は、自分の直接上司の申請を見つけるだけでいいです.直接上司は従業員の休暇を拒否することができ、休暇を取る時間が直接上司の承認範囲を超えた場合、直接上司はその従業員の休暇申請を提出することができる.承認権限を持つ2つのレベルの承認を経て、従業員は正常に休暇を取ることができます.
次のようにインスタンス・プロセスを示します.
          【   -  】       ;  :【2】 。
          【   -  】       ;  :【2】 。
          【   -  】       ;  :【2】 。
          【   -  】       ;  :【3】 。
           【   -  】       ;  :【3】 。
          【   -  】       ;  :【3】 。
          【   -  】       ;  :【3】 。
          【   -   】       ;  :【5】 。
           【   -   】       ;  :【5】 。
           【   -   】       ;  :【5】 。
          【   -   】       ;  :【5】 。
          【   -   】       ;  :【5】 。
          【   -   】       ;  :【10】 。
           【   -   】       ;  :【10】 。
           【   -   】       ;  :【10】 。
           【   -   】       ;  :【10】 。
           【   -   】       ;  :【10】 。
           【   -   】       ;  :【10】 。
           【    -  】       ;  :【12】 。
           【    -  】       ;  :【12】 。
           【    -  】       ;  :【12】 。
           【    -  】       ;  :【12】 。
           【    -  】       ;  :【12】 。
           【    -  】       ;  :【14】 。
           【    -  】       ;  :【14】 。
           【    -  】       ;  :【14】 。
           【    -  】       ;  :【14】 。
           【    -  】       ;  :【14】 。
           【    -  】       ;  :【20】 。
           【    -  】       ;  :【20】 。
           【    -  】       ;  :【20】 。
           【    -  】       ;  :【20】 。
           【    -   】       ;  :【60】 。
           【    -   】       ;  :【60】 。
           【    -   】       ;  :【60】 。
            【     -   】       ;  :【120】 。
Master      【     -   】       ;  :【120】 。
Master      【     -   】       ;  :【120】 。

コードせっけい
責任チェーンを用いて問題を解決することを知っている以上、責任チェーンの思想に従って現実問題を解決する.抽象休暇処理のインタフェース、Javaでのインタフェース定義ルール.以下の図に、IHandlerインタフェースは3つの方法を宣言し、dispatchの先頭の方法は休暇申請を提出する方法である.onInterceptの冒頭の方法は、この休暇申請をブロックするかどうかを示します.handleの先頭のメソッドは、このリクエストを処理し、申請を承認および拒否することができ、この休暇申請が上司に提出されていないことを示します.
package me.ziuo.design_pattern.cop.employee;

/**
 * 
 * @author ziyuo
 * @Description              
 */
public interface IHandler {

    /**
     *       
     * @param askModel
     * @return     
     */
    boolean dispatchAsk(LeaveAskModel askModel);

    /**
     *       
     * @param askModel
     * @return     
     */
    boolean onInterceptAsk(LeaveAskModel askModel);
    /**
     *       
     * @param askModel
     * @return     
     */
    boolean handleAsk(LeaveAskModel askModel);

}

LeaveAskModel休暇リクエストクラス.このデータモデルには、変更された日数と申請者情報が保存されています.図のように.
package me.ziuo.design_pattern.cop.employee;

/**
 * 
 * @author ziyuo
 * @Description           
 */
public class LeaveAskModel {
    private int days;//     
    private Employee askEmp;//    

    public LeaveAskModel(int days, Employee askEmp) {
        super();
        this.days = days;
        this.askEmp = askEmp;
    }

    public int getDays() {
        return days;
    }

    public void setDays(int days) {
        this.days = days;
    }

    public Employee getAskEmp() {
        return askEmp;
    }

    public void setAskEmp(Employee askEmp) {
        this.askEmp = askEmp;
    }

}

従業員の抽象クラスIHandlerで定義されたインタフェースを実装する方法で、従業員ロール情報、従業員名情報、処理可能な最大申請日数、直属リーダー(休暇申請を処理する権限がない場合は上に提出できます).ここで、IHandlerを実装する方法説明dispatchの先頭にある方法の具体的な意味は、まず、このロールがこの要求をブロックするかどうかを判断し、ブロックすると要求を呼び出す方法が、handleAskの結果に依存して承認されるかどうかを判断することである.onInterceptの先頭メソッドの具体的な意味は、ロールタイプがコミットされたオブジェクトと異なるかどうか、コミット者が申請したコミット時間が長くて処理できる場合、そのリクエストをブロックした後に応答を要求する承認処理を選択することである.handleの最初の方法は承認要求を行うために使用され、論理的には、従業員の情報に基づいて応答する処理が行われ、ここでは実装例にすぎない.図のように.
package me.ziuo.design_pattern.cop.employee;

public abstract class Employee implements IHandler{
    
    private String actor;//      
    private String name;//    
    private int maxHandleDay;//          (       )
    
    private Employee leader;//    

    public Employee(String actor, int maxHandleDay) {
        super();
        this.actor = actor;
        this.maxHandleDay = maxHandleDay;
    }
    
    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public int getMaxHandleDay() {
        return maxHandleDay;
    }

    public void setMaxHandleDay(int maxHandleDay) {
        this.maxHandleDay = maxHandleDay;
    }

    public boolean dispatchAsk(LeaveAskModel askModel) {
        if(onInterceptAsk(askModel)){
            return handleAsk(askModel);
        }else{
            if(getLeader()!=null){
                System.out.println(getActor()+"       【"+askModel.getAskEmp().actor+"】       ;  :【"+askModel.getDays()+"】 。");
                return getLeader().dispatchAsk(askModel);
            }else{
                System.out.println(getActor()+"       【"+askModel.getAskEmp().actor+"】       ;  :【"+askModel.getDays()+"】 。");
                
                //              ,           (      )。
                System.out.println("【    】"+"      【"+askModel.getAskEmp().actor+"】       ;  :【"+askModel.getDays()+"】 。");
                System.out.println("【    】"+"      【"+askModel.getAskEmp().actor+"】       ;  :【"+askModel.getDays()+"】 。");
                return false;
            }
        }
    }

    public boolean onInterceptAsk(LeaveAskModel askModel) {
        
        if(askModel!=null&&!this.getClass().equals(askModel.getAskEmp().getClass())&&askModel.getDays()

各オブジェクトのカプセル化例を以下に示す.プログラマクラスコード
package me.ziuo.design_pattern.cop.employee;

public class Programmer extends Employee {
    public Programmer() {
        this("   ", 0);
    }

    public Programmer(String actor, int maxHandleDay) {
        super("   ", 0);
        setLeader(new TeamLeader());
    }
    
    public boolean dispatchAsk(LeaveAskModel askModel) {
        return super.dispatchAsk(askModel);
    }
    
    public boolean onInterceptAsk(LeaveAskModel askModel) {
        return !(askModel.getAskEmp() instanceof Programmer);
    }

}


TeamLeaderクラスコード
package me.ziuo.design_pattern.cop.employee;

public class TeamLeader extends Employee {

    public TeamLeader() {
        this("    ", 3);
    }
    public TeamLeader(String actor, int maxHandleDay) {
        super("    ", 3);
        setLeader(new CTO());
    }
    
}

CTOクラスコード
package me.ziuo.design_pattern.cop.employee;

public class CTO extends Employee {

    public CTO() {
        this("    ", 5);
    }

    public CTO(String actor, int maxHandleDay) {
        super("    ", 5);
        setLeader(new PV());
    }
    
}

PV類コード
package me.ziuo.design_pattern.cop.employee;

public class PV extends Employee {

    public PV(){
        this("    ", 10);
    }
    public PV(String actor, int maxHandleDay) {
        super("    ", 10);
        setLeader(new CEO());
    }

}

CEOクラスコード
package me.ziuo.design_pattern.cop.employee;

public class CEO extends Employee {

    public CEO(){
        this("     ", 120);
    }
    public CEO(String actor, int maxHandleDay) {
        super("     ", 120);
        setLeader(null);
    }
    
}

各キャラクターの休暇申請を上方に伝える処理チェーンは、いわゆる責任チェーンを構成している.トップレベルのCEOを除いて、残りの役割は彼の直接的なリーダーを持っている.このダイレクトリーダーシップを持つチェーンは一方向チェーンテーブルを構成し、責任チェーンモードの一部のシーンでは、責任処理セットをリンクするために一方向チェーンテーブルが直接使用されます.責任チェーン設計モデルはここで紹介します.
Androidイベント配信プロセスの責任チェーン設計モデルの運用については、次のリンクに移動してください.Androidイベント配信プロセス(二)ソースコード解析