Chain of Responsibilityのサンプルコードです。
package org.example.chainofresponsibility;
public class Question {
public int level;
public Question(int level){
this.level = level;
}
}
package org.example.chainofresponsibility;
public abstract class Handler {
private Handler next;
public Handler setNext(Handler next)
{
this.next = next;
return next;
}
public final void request(Question question)
{
if(judge(question)) {
// 処理完了
} else if(next != null) {
next.request(question);
} else {
// 処理不可能
}
}
protected abstract boolean judge(Question question);
}
package org.example.chainofresponsibility;
public class ConcreteHandler1 extends Handler {
@Override
protected boolean judge(Question question) {
if(question.level <= 1) {
return true;
} else {
return false;
}
}
}
package org.example.chainofresponsibility;
public class ConcreteHandler2 extends Handler{
@Override
protected boolean judge(Question question) {
if(question.level <= 2) {
return true;
} else {
return false;
}
}
}
package org.example.chainofresponsibility;
public class Main {
public static void main(String[] args)
{
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setNext(handler2);
Question question = new Question(1);
handler1.request(question);
}
}
Chain of Responsibilityは処理を行う人(Handler)を数珠つなぎに配列しておき、リクエスト(Question)に対して先頭のHandlerから処理が可能かどうかを判定(judge)し、処理できない物であれば後ろのHandlerにまる投げする、という仕組みです。
なので、あらかじめHandlerを継承しているConcreteHandlerを作成して数珠つなぎを作っておく必要があります。
ConcreteHandlerにてjudge=trueならば、渡されたquestionを適切に処理し、judge=falseならば、そのquestionを後ろのConcreteHanderに渡します。