
では、どのように、飛ぶ振る舞いと鳴く振る舞いを実装するクラス群を
設計すればよいのでしょうか?
狙いは、柔軟性を保つことです。最初に問題になったのはカモの振る
舞いに柔軟性がなかったことでした。また、振る舞いを
Duck
のインスタ
ンスに割り当てたいこともわかっています。例えば、
MallardDuck
の新
しいインスタンスをインスタンス化し、特定の種類の飛ぶ振る舞いで初
期化したいかもしれません。また、その際には、カモの振る舞いを動的
に変更できるようにするのも当然でしょう。言い換えれば、振る舞いの
セッターメソッドを
Duck
クラスに持たせ、
MallardDuck
の飛ぶ振る舞い
を実行時に変更できるようにすべきです。
この目的を前提にして、
2
番目の設計原則を考えましょう。
カモの振る舞いを設計する
それぞれの振る舞いを表すインタフェース(例えば、
FlyBehavior
と
QuackBehavior
)を使用し、それぞれの振る舞いの実装がこのようなイン
タフェースの
1
つを実装します。
したがって、今回は飛ぶ振る舞いと鳴く振る舞いのインタフェースを
実装するのは Duckクラスのサブクラスではありません。代わりに、振る
舞い(例えば「キューキューという音を発する」など)を表すことだけ
を目的としたクラス群を作成します。振る舞いインタフェースを実装す
るのは、
Duck
クラスではなく振る舞いクラスとなります。
これは以前行っていた方法とは対照的です。これまでは、
Duck
スー
パークラス内の具象実装を使うか、サブクラス自体の中で特化した実装 ...