@634

Chain of Responsibility パターン

Advertisement

複数のオブジェクト間で処理要求を転送する

複数のオブジェクトを参照でつないでおき、処理要求を転送する。処理要求を受け取ったオブジェクトは、その処理を自分で行う事ができるなら実行する。自分で処理できない場合、次のオブジェクトへと処理を転送する。

CoRパターンを用いることで、処理を機能単位で分割することが可能となる。そして、各クラスが自分で処理が可能か判定するので、処理を利用するクラス内に要求の判定(ifやswitch)を記述する必要がなくなる。

サンプルコード

抽象クラス Handler
public abstract class Handler {
    private String name;
    private Handler nextHandler;

    public Handler(String name){
        this.name = name;
    }
    public void setNextHandler(Handler handler){
        this.nextHandler = handler;
    }

    public abstract boolean doit(Empolyee emp);

    public void chain(Empolyee emp){
        if(this.doit(emp)){
            // 終了
        }else if(nextHandler != null){
            // 次の Handler へオブジェクトを渡す
            nextHandler.chain(emp);
        }else{  // nextHandler == null
            System.out.println("処理できませんでした。");
        }
    }
}

クラス FineHandler
public class FineHandler extends Handler{
    public FineHandler(String name){
        super(name);
    }

    public boolean doit(Empolyee emp){
        if(emp.getLevel() > 5){
            System.out.println(emp.getName() + "は優秀");
            return true;
        }else{
            return false;
        }
    }
}

クラス NormalHandler
public class NormalHandler extends Handler{
    public NormalHandler(String name){
        super(name);
    }

    public boolean doit(Empolyee emp){
        if(emp.getLevel() > 0){
            System.out.println(emp.getName() + "は普通");
            return true;
        }else{
            return false;
        }
    }
}

クラス BadHandler
public class BadHandler extends Handler{
    public BadHandler(String name){
        super(name);
    }

    public boolean doit(Empolyee emp){
        System.out.println(emp.getName() + "はダメ");
        return true;
    }
}

クラス Empolyee
public class Empolyee {
    private String name;
    private int level;

    public Empolyee(String name, int level){
        this.name = name;
        this.level = level;
    }

    public int getLevel(){
        return this.level;
    }

    public String getName(){
        return this.name;
    }
}

クラス Main
public class Main {
    public static void main(String[] args) {
        // 各ハンドラ初期化
        Handler fine = new FineHandler("Fine");
        Handler normal = new NormalHandler("Normal");
        Handler bad = new BadHandler("Bad");

        // 連鎖設定
        fine.setNextHandler(normal);
        normal.setNextHandler(bad);

        // 各社員設定
        Empolyee scott = new Empolyee("scott", 10);
        Empolyee tiger = new Empolyee("tiger", 5);
        Empolyee micky = new Empolyee("micky", 0);

        // 処理
        fine.chain(scott);
        fine.chain(tiger);
        fine.chain(micky);
    }
}

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール