6

いくつかの作業を実行する util クラスがあります。明らかに、拡張のために閉じられており、すべてのメソッドは静的です。簡単にするために、クラスは次のようになります。

public final class Util {
    private Util() { }

    public static void doWork() {
        // some work
        int variable = help();
        // some work uses variable
    }

    private static int help() {
        // some helper functionality
    }
}

クラスにdoWorkは、多くの計算を実行するメソッドがあります。ところで、メソッドはヘルパー メソッドhelpを呼び出して何らかの結果を取得し、残りのコードはhelpメソッドによって返された結果を使用します。

ここで、クライアント コードで method の機能を再利用したいのですdoWorkが、呼び出す代わりにmethodhelpを呼び出したいと思いますhelp2。最も簡単な解決策doWork2は、に置き換えhelpてメソッドを作成するだけhelp2です。

doWorkのすべての変更はいずれかで複製する必要があるため、これは非常に悪いアプローチdoWork2です。これはパターンに非常に似てTemplate Methodいますが、ここには拡張機能がないため、適用できません。

このメソッドにパラメーターを追加するために思いついた最善の解決策ですが、既存のすべてのユーザーを保持しますdoWork

public static void doWork() {
    doWorkWithParameter(true);
}

public static void doWorkWithParameter(boolean helpOrHelp2) {
    // some work
    int variable = helpOrHelp2 ? help() : help2();
    // some work uses variable
}

この問題を解決するために適用できるより良い設計ソリューションは何ですか? 持っているような柔軟性を実現する方法はありTemplate Patternますが、util クラスへの適用にはありますか。

前もって感謝します。

4

3 に答える 3

5

私の提案は、 Util クラスが Invoker であり、各 doWork-help ペアが Worker インターフェイスを使用してカプセル化されているCommand Patternに触発されています。

ワーカー インターフェイスは次のようになります。

public interface Worker {
    public void doWork();
    public int help();
}

ユーティリティ クラス

public final class Util {
    private Util() { }

    public static void toWork(Worker worker){
        worker.doWork();
    }

}

Concrete Worker (help と doWork の実装)

public class ConcreteWorker implements Worker{

    @Override
    public void doWork() {
        // TODO Auto-generated method stub
            int variable = help();

    }

    @Override
    public int help() {
        // TODO Auto-generated method stub
        return 0;
    }

}

別の労働者

public class ConcreteWorker2 implements Worker{

    @Override
    public void doWork() {
        // TODO Auto-generated method stub
            int variable = help();

    }

    @Override
    public int help() {
        // TODO Auto-generated method stub
        return 1;
    }

}

そして処刑

Util.toWork(new ConcreteWorker());
Util.toWork(new ConcreteWorker2());
于 2013-04-26T12:59:55.917 に答える
1

help() メソッドを持つ2 つの静的オブジェクトHelp1Help2実装Helpインターフェイスを作成し、次のように doWorkWithParameter メソッドを変更できます。

public static void doWorkWithParameter(Help h) {
    int variable = h.help();
}

これは、現在のソリューションと密接に関連しています。しかし、それはもう少し「オブジェクト指向」だと思います。

于 2013-04-26T12:56:36.580 に答える
1

少し前に私はこれを作りました:

public static enum Helper{
    OLD(){
        public int help(){
            return 0;
        }
    },

    NEW(){
        public int help(){
            return 1;
        }
    };

    public abstract int help();

    public void doWork() {
        int variable = help();
    }
}

public static Helper HELPER = Helper.NEW;

次に、次を呼び出すことができます。

Constants.HELPER.doWork()

HELPER定数値を切り替えることで、動作を変更できます。またはあなたが行うことができます:

Helper.OLD.doWork();
Helper.NEW.doWork();
于 2013-04-26T12:56:57.357 に答える