liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - Chain Of Responsibility

【Chain Of Responsibilityパターンとは】

責任者(処理者)を鎖状にして、いずれだれか処理するようにする。

 

Chain Of Responsibilityパターンのクラス図】

Chain Of Responsibilityパターンのメリット】

動的に鎖状を変更できる。

ほか色々あるね・・・たぶん

 

【サンプル】

Responsibility.java
package responsibility;
 
public abstract class Responsibility {
private Responsibility next;
 
    protected Responsibility setNext(Responsibility responsibility) {
        this.next = responsibility;
 
        return next;
    }
 
    protected final void request(int money) {
        if(canProcess(money)) {
            process(money);
 
        } else if(next != null) {
            // 次の責任者に依頼
            next.request(money);
 
        } else {
            // 誰も処理できない
            System.out.println("だれも決済できませんでした!!");
        }
    }
 
    protected abstract boolean canProcess(int money); // 決済可能か
    protected abstract void process(int money);       // 決済
}
 
 
 
 
 

 

Katyo.java
package responsibility;
// 課長
public class Katyo extends Responsibility{
 
    @Override
    protected boolean canProcess(int money) {
        if (money < 100000) {
            return true;
        }
        return false;
    }
 
    @Override
    protected void process(int money) {
        System.out.println("課長が" + money + "円を処理しました。");
    }
 
}
 
 
Border.java
package responsibility;
// 部長
public class Butyo extends Responsibility{
 
    @Override
    protected boolean canProcess(int money) {
        if (money < 500000) {
            return true;
        }
        return false;
    }
 
    @Override
    protected void process(int money) {
        System.out.println("部長が" + money + "円を処理しました。");
    }
 
}

 

 
Border.java
package responsibility;
// 社長
public class Shatyo extends Responsibility{
 
    @Override
    protected boolean canProcess(int money) {
        if (money < 1000000) {
            return true;
        }
        return false;
    }
 
    @Override
    protected void process(int money) {
        System.out.println("社長が" + money + "円を処理しました。");
    }
}
 
ResponsibilityTest.java
package responsibility;
 
public class ResponsibilityTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
 
        // int processMoney = 100000
 
        Responsibility katyo = new Katyo();
        Responsibility butyo = new Butyo();
        Responsibility shatyo = new Shatyo();
 
        // 責任連鎖
        katyo.setNext(butyo).setNext(shatyo);
 
        katyo.request(99999);
        katyo.request(499999);
        katyo.request(999999);
        katyo.request(1000000);
    }
}

実行結果
課長が99999円を処理しました。
部長が499999円を処理しました。
社長が999999円を処理しました。
だれも決済できませんでした!!