アプローチ 1
状態パターンを使用します。if
それはあなたの問題を処理し、 s とsを排除しますelse
。
これがJava の例です。
状態パターンは、メソッド呼び出しを、同じインターフェースを実装するが動作が異なるオブジェクトに委任します。
状態パターンの例:
public class StatePatternExample {
public static void main(String[] args) {
Girlfriend anna = new Girlfriend();
// OUTPUT
anna.kiss(); // *happy*
anna.greet(); // Hey, honey!
anna.provoke(); // :@
anna.greet(); // Leave me alone!
anna.kiss(); // ...
anna.greet(); // Hey, honey!
}
}
interface GirlfriendInteraction extends GirlfriendMood {
public void changeMood(GirlfriendMood mood);
}
class Girlfriend implements GirlfriendInteraction {
private GirlfriendMood mood = new Normal(this);
public void provoke() {
mood.provoke();
}
public void kiss() {
mood.kiss();
}
public void greet() {
mood.greet();
}
public void changeMood(GirlfriendMood mood) {
this.mood = mood;
}
}
interface GirlfriendMood {
public void provoke();
public void kiss();
public void greet();
}
class Angry implements GirlfriendMood {
private final GirlfriendInteraction context;
Angry(GirlfriendInteraction context) { // more parameters, flags, etc. possible
this.context = context;
}
public void provoke() {
System.out.println("I hate you!");
}
public void kiss() {
System.out.println("...");
context.changeMood(new Normal(context));
}
public void greet() {
System.out.println("Leave me alone!");
}
}
class Normal implements GirlfriendMood {
private final GirlfriendInteraction context;
Normal(GirlfriendInteraction context) {
this.context = context;
}
public void provoke() {
System.out.println(":@");
context.changeMood(new Angry(context));
}
public void kiss() {
System.out.println("*happy*");
}
public void greet() {
System.out.println("Hey, honey!");
}
}
ご覧のとおり、クラスにはとGirlfriend
がありません。それはかなりきれいに見えます。if
else
クラスGirlfriend
はあなたに対応し、abstract class X
クラスNormal
とは、およびに対応します。Angry
A
B
C
次に、クラスY
はケースをチェックせずに X に直接委譲します。
アプローチ 2
コマンド パターンを使用します。Y
次に、コマンド オブジェクトをsdoStuff()
メソッドに渡して、それを実行するだけです。