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!ログール |