7. 名前 説明
Trouble 発生したトラブルを表すクラス
Support トラブルを解決する抽象クラス
NoSupport トラブルを解決する具象クラス①
LimitSupport トラブルを解決する具象クラス②
OddSupport トラブルを解決する具象クラス③
SpecialSupport トラブルを解決する具象クラス④
Main Supportの連鎖を作りトラブル
を起こす動作テスト用クラス
クラス一覧
7
8. public class Trouble {
private int number;
public Trouble(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public String toString() {
return "[Trouble " + number + "]";
}
}
Troubleクラス
発生したトラブルを表す
トラブル番号
トラブル番号を
[Trouble1]のように返す
8
9. public abstract class Support {
private String name;
private Support next;
public Support(String name) {
this.name = name;
}
public Support setNext(Support next) {
this.next = next;
return next;
}
public void support(Trouble trouble) {
if (resolve(trouble)) {
done(trouble);
} else if (next != null) {
next.support(trouble);
} else {
fail(trouble);
}
}
public String toString() {
return "[" + name + "]";
}
protected abstract boolean resolve(Trouble trouble);
protected void done(Trouble trouble) {
System.out.println(trouble + " is resolved by " + this + ".");
}
protected void fail(Trouble trouble) {
System.out.println(trouble + " cannot be resolved.");
}
}
Supportクラス
トラブルを解決する連鎖
を作るための抽象クラス
9
たらい回し先設定
たらい回し先
トラブル解決者
トラブル解決手順
解決用メソッド
解決時に表示する文字列
未解決時に表示する文字列
10. public class NoSupport extends Support {
public NoSupport(String name) {
super(name);
}
protected boolean resolve(Trouble trouble){
return false
}
}
NoSupportクラス
トラブル解決①
解決者名登録
全てのトラブルを
解決しない
10
11. public class LimitSupport extends Support {
private int limit;
public LimitSupport(String name, int limit)
super(name);
this.limit = limit;
}
protected boolean resolve(Trouble trouble){
if (trouble.getNumber() < limit) {
return true;
} else {
return false;
}
}
}
LimitSupportクラス
解決者名登録
11
トラブル解決②
リミット番号登録
リミット番号未満
であれば解決できる
12. public class OddSupport extends Support {
public OddSupport(String name) {
super(name);
}
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() % 2 == 1) {
return true;
} else {
return false;
}
}
}
OddSupportクラス
解決者名登録
12
トラブル解決③
奇数番号
であれば解決できる
13. public class SpecialSupport extends Support {
private int number;
public SpecialSupport(String name, int number) {
super(name);
this.number = number;
}
protected boolean resolve(Trouble trouble)
if (trouble.getNumber() == number) {
return true;
} else {
return false;
}
}
}
SpecialSupportクラス
解決者名登録
13
トラブル解決④
スペシャル番号と同じ
であれば解決できる
スペシャル番号登録
14. public class Main {
public static void main(String[] args) {
Support alice = new NoSupport("Alice");
Support bob = new LimitSupport("Bob", 100);
Support charlie = new SpecialSupport("Charlie", 429);
Support diana = new LimitSupport("Diana", 200);
Support elmo = new OddSupport("Elmo");
Support fred = new LimitSupport("Fred", 300);
alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);
for (int i = 0; i < 500; i += 33) {
alice.support(new Trouble(i));
}
}
}
Mainクラス
14
解決者の登録
様々なトラブル発生
連鎖の形成
15. 実行結果
15
名前 解決条件 たらい回し先
Alice なし Bob
Bob 100未満 Charlie
Charlie 429のみ Diana
Diana 200未満 Elmo
Elmo 奇数番号 Fred
Fred 300未満
トラブル363の例
16. 実行結果
[Trouble 0] is resolved by [Bob].
[Trouble 33] is resolved by [Bob].
[Trouble 66] is resolved by [Bob].
[Trouble 99] is resolved by [Bob].
[Trouble 132] is resolved by [Diana].
[Trouble 165] is resolved by [Diana].
[Trouble 198] is resolved by [Diana].
[Trouble 231] is resolved by [Elmo].
[Trouble 264] is resolved by [Fred].
[Trouble 297] is resolved by [Elmo].
[Trouble 330] cannot be resolved.
[Trouble 363] is resolved by [Elmo].
[Trouble 396] cannot be resolved.
[Trouble 429] is resolved by [Charlie].
[Trouble 462] cannot be resolved.
[Trouble 495] is resolved by [Elmo].
16
名前 解決条件 たらい回し先
Alice なし Bob
Bob 100未満 Charlie
Charlie 429のみ Diana
Diana 200未満 Elmo
Elmo 奇数番号 Fred
Fred 300未満
25. Main Support
- name
- next
+support
+setNext
#resolve
NoSupport
#resolve
Request
LimitSupport
- limit
#resolve
OddSupport
#resolve
SpecialSupport
- number
#resolve