
重要なのは、カモが
Duck
クラス(またはそのサブクラス)で定義された
鳴くためのメソッドや飛ぶためのメソッドを使用する代わりに、鳴く振る
舞いや飛ぶ振る舞いに委譲(デリゲート)するようになることです。
以下にその方法を示します。
public abstract class Duck {
QuackBehavior quackBehavior;
//
さらに続く
public void performQuack() {
quackBehavior.quack();
}
}
カモの振る舞いを統合する
まずDuckクラスにFlyBehavior型とQuackBehavior型の2つのインスタンス変数を追加します。この
2
つのインスタンス変数を
flyBehavior
と
quackBehavior
と呼びましょう。カモオブジェクトは実行時にこれ
らの変数に特定の振る舞い(飛ぶための
FlyWithWings
や鳴くための
Squeak
など)を代入します。
また、
Duck
クラス(およびすべてのサブクラス)から
fly()
メソッドと
quack()
メソッドを取り除きます。
なぜなら、これらの振る舞いを
FlyBehavior
クラスと
QuackBehavior
クラスに移動させたからです。
Duck
クラスの
fly()
と
quack()
を、
performFly()
と
performQuack()
という
2
つの類似したメソッドに置き換
えます。次に、これらがどのように機能するかを説明します。
1
2
これらのメソッドが
fly()
と
quack()
を置