2

デザインに問題があります

doSomethingがケースAに呼び出された場合、メソッドdoSomethingを作成する必要があります。そのシグネチャは、ケースBに呼び出された場合とは異なります。

doSomething(param1, param2) When called from A
doSomething(param3, param4) When called from B

最初は、インターフェイスを作成して、ケースAとケースBに実装したかったのです。

(ps。私は実際に同じ問題を持ついくつかのそのような方法が必要です

doSomething1(T) When called from A
doSomething1(X) When called from B

doSomething2(E) When called from A
doSomething2(N) When called from B

等...)

好みのデザインを提案していただけますか?


編集:変更された質問はそれがより明確であることを願っています

4

3 に答える 3

2

この問題を解決するには、戦略デザイン パターンで Java Generics を使用できます。

Case1 と Case2 の 2 つの「ケース」があり、各ケースの doSomething() メソッドを持つクラスを「ハンドラー」と呼びます。

まず、Handler を定義するインターフェースを用意します。

public interface Handler<TYPE1, TYPE2, TYPE3>{

    void doSomething(TYPE1, TYPE2, TYPE3);

    void doSomethingElse(TYPE3);

}

ハンドラーは次のようになります。

public class Case1Handler implements Handler<Case1Type1, Case1Type2, Case1Type3>{

    public void doSomething(Case1Type1 t1, Case1Type2 t2, Case1Type3 t3){
        // do case 1 business
    }

    public void doSomethingElse(Case1Type3 t3){
        // do case 1 business
    }

}

Case2 にも同様の実装があります。

今、あなたはまだ doSomething() と doSomethingElse() の同じビジネスを 2 回コーディングしています。ここで戦略パターンが役立ちます。

基本的に、さまざまなタイプのオブジェクトに対して同じビジネスを実行しています。これらの違いを別のクラス (The Strategy) に移動し、この戦略をHandlerの1 つの実装に注入できます。

public class HandlerImpl<TYPE1, TYPE2, TYPE3> implements Handler<TYPE1, TYPE2, TYPE3>{

    private Strategy<TYPE1, TYPE2, TYPE3> strategy;

    public HandlerImpl(Strategy<TYPE1, TYPE2, TYPE3> strategy){
        this.strategy = strategy;
    }

    public void doSomething(TYPE1 t1, TYPE2 t2, TYPE3 t3){
        // do your business using "strategy"
    }

    public void doSomethingElse(TYPE3 t3){
        // do your business using "strategy"
    }

}

これはやり過ぎに思えるかもしれませんが、決してそうではありません。これにより、コードがよりクリーンになり、変更 (新しいケースの追加、ビジネスの変更) が実装しやすくなります:)

于 2012-06-13T09:07:59.117 に答える
1

したがって、特定のタイプのデータを処理するメソッドがありますが、クラスまたは別のクラスから呼び出された場合、データは少し異なって見えます。

それが正しくなく、データがまったく異なり、関連性がない場合は、実際にいくつかの方法を実行することをお勧めします。

データが類似している場合は、次のようなデータを含むオブジェクトを作成することをお勧めします。

public class MyData {
    public MyData(A, B, C){ /* Do your thing */ }
    public MyData(D, E, F){ /* Do your other thing */ }

次に、実装しようとしているインターフェイスに MyData オブジェクトをパラメーターとして使用させます

doSomething(MyData data);

それはおそらくあなたが説明したことで私がすることですが、うまくいかない場合は遠慮なくフィードバックをお寄せください!

于 2012-06-13T08:25:48.600 に答える
1
doSomething1(T) When called from A
doSomething1(X) When called from B

doSomething() がこれらのメソッドの両方で同じことを行う場合、メソッドを doSometing(S) として実装できます。ここで、S は T と X の両方によって実装されるインターフェイスです。

T と X がまったく似ていない場合、それぞれ doSomething(T) と doSomething(X) を提供する別のクラス DoerT と DoerX が必要になる場合があります。

于 2012-06-13T08:44:17.367 に答える