え?このプログラムがオブジェクト指向なの?
俺にはこの設計が理解できないなあ

例えば飛べない鳥duckはflyメソッドを持ってはいけないという前提でどうクラス構成するかって話なんだけど、
飛べない鳥duckがそもそもflyを持っていいという設計思想を踏襲するなら、素直にflyメソッドをもつabstract birdクラスまたはflyableインタフェースをDuckは継承または実装し、flyをoverrideあるいはimplementにすればいいと思うんだけど

ストラテジーパターンと言い張ってるけどストラテジーパターンではないよね、それはブリッジパターンだよ
素直にFlyableインタフェースを使ってfly可能なものに対してはflyableインタフェースを素直に実装するのがストラテジーパターンでしょ、間にコンポジションは挟まないよ

という無駄な分類学とデザパタ議論が栄えるだけなのがオブジェクト指向
ここまで一切どのようにエレガントに鳥を飛ばせるかなんて議論なかったでしょ

こういう複雑なだけでくだらない議論に巻き込まれないためにも、動的言語及び関数型言語を勉強する価値がある