私はこの問題にJavaとScalaの両方のタグを付けました。主にJavaで開発していますが、Scalaのソリューションが異なるかどうか確認したいと思います。共通のインターフェイスで異なる動作をするクラスを設計する
私のアプリケーションのクラスを設計する際に問題があります。私は、異なる行動を持つ共通のオブジェクトのセットを持っています。私は最近、パターンについての本を読んでいたので、「わかりました、私はここで戦略パターンを使うことができます」、行動をフィールドオブジェクトとして定義し、すべてのロジックを委譲しました。そして、ここに私の問題が始まっています:)
私は飛ぶことができると私はいくつかのFlyBehaviourに飛行を委任する基本クラスを持っていると言いましょう。
しかし、私のアヒルは少し違っていて、私は行動がそれに依存してほしいと思っています。最初に私はSpaceDuckを持っています。SpaceDuckはSpaceDuckのためだけに定義されたspaceShipフィールドを使用します。次に、HelicopterDuckをできるだけ低速で飛ばして、HelicopterDuckのためだけに定義されている防空防空壕を使います。だから、コードでは、ここに私の行動の実装では、私が実際にspaceduckするための基準やhelicopterduckを持っていないと、このコードはコンパイルされません。この
class SpaceDuck extends Duck {
String spaceship;
}
class SpaceFlyBehaviour implements IFlyBehaviour {
void fly() {
System.out.println("Flying in space on spaceship: " + spaceduck.spaceship);
}
}
class HelicopterDuck extends Duck {
int flares;
}
class HelicopterFlyBehaviour implements IFlyBehaviour {
void fly() {
while(helicopterduck.flares > 0) {
System.out.println("I'm going low and using flares");
helicopterduck.flares--;
}
}
}
のようなものです。私はちょうど私が想像した方法のサンプルを提供しました。私はIFlyBehaviourを修正し、アヒルをfly()メソッドの引数として渡すことができましたが、ダックの特定のフィールドにアクセスするためにダウンキャストしなければなりません。
明らかに、IFlyBehaviourを落として、各アヒルのfly()メソッドにロジックを移しているようです。しかし、私は、多くの異なる宇宙飛行行動とヘリコプター行動を期待しており、fly()は唯一の方法ではありません。それはsquack()、run()などであり、それぞれ異なる動作セットを持ちます。だから私のクラス階層は巨大になり、サポートされなくなります。
私の実際のアプリケーションでは、いくつかの実行可能かつ停止可能なインスタンスを実行し、異なる方法で停止できます。 1つのインスタンスはSSHスクリプトを介して起動され、もう1つはMBean(またはSSH、ユーザーの設定によります)、サードパーティなどを使用して3番目に起動されます。
正しい方向に私を押し込むという考えは非常に役に立ちます。前もって感謝します!
これは興味があるかもしれません:http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ –
面白そうです。共有してくれてありがとう。 – Soteric