1

以下は、デザイン パターンに関する簡単な質問です。

現在のプロジェクトの一環として、(Web サービスと関連するクライアント スタブを使用して) データベース検索を実行し、結果を返すインターフェイスを作成しました。結果は、後で JSON 要求への応答として Struts アクションによって使用されます。

インターフェイスは次のようなものです。

    public interface DynamicSearchProvider {

        JSONObject getSearchResultsAsJSONObject(DatatablesRequestParams params) 
                throws JSONException;

    }

次に、オブジェクトの特定のタイプごとに、上記の具体的なバージョンが実装され、関連する Web サービスを呼び出して結果を返します。

基本的に、私が知る限り、これは一連のビジネス ロジックの単なるラッパーです。

問題は、これを何と呼ぶか​​ということです。プロバイダーという用語はかなりあいまいなので好きではありません。これに対して明確に定義された設計パターンはありますか?

理想的には、これでSpringを使用することを好みましたが、残念ながら、このプロジェクトはレガシーコードベースの一部であるため、このプロジェクトでは使用できません...

編集:

使用される場所は次のとおりです。

public abstract class GenericDynamicSearchAction extends GenericAction {

    private static Log log = LogFactory.getLog(GenericDynamicSearchAction.class);

    /**
     * Method to be implemented by each individual search action
     */
    public abstract DynamicSearchProvider getDynamicSearchProvider();

    public final ActionForward executeAuthenticated(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException {

        log.debug("called");

        DatatablesRequestParams datatablesRequestParams = DatatablesUtils.extractDatatablesParamsFromRequest(request);

        try {


            JSONObject jsonResponse = getDynamicSearchProvider().getSearchResultsAsJSONObject(datatablesRequestParams);

            String echo = datatablesRequestParams.getEcho();

            jsonResponse.put(DatatablesUtils.ECHO_FIELD_NAME, echo);
            response.setContentType("application/json");

            String jsonResponseString = jsonResponse.toString();

            log.debug("Returning JSON response:"+jsonResponseString);

            response.getWriter().print(jsonResponseString);

        } catch (JSONException e) {

            response.setContentType("text/html");
            response.getWriter().print(e.getMessage());

        }

        return null;

    }

等...

したがって、特定のタイプのオブジェクトに対して、上記の Action クラスの具体的なバージョン (ちなみにこれは stuts アクションです) が実装され、上記の「プロバイダー」の実装への参照が含まれます...次のようになります。

public class PolicyDynamicSearchAction extends GenericDynamicSearchAction {

    @Override
    public final DynamicSearchProvider getDynamicSearchProvider() {

        return new PolicyDynamicSearchProvider();

    }
}

public class PolicyDynamicSearchProvider implements DynamicSearchProvider {

    public final JSONObject getSearchResultsAsJSONObject(DatatablesRequestParams params) throws JSONException {
//some business logic that goes to webservice etc to get the info
}
}

それがより明確になることを願っています。

4

2 に答える 2

2

「ビジネスロジックの束」から推測すると、それはファサードです。それでも、デザインパターンの後にクラスを命名することは、一般的には良い考えではありません。第一に、クラスは一度に複数の設計パターンを実装できます。第二に、このアプローチはリファクタリング中に維持するのが困難です。

メソッドがファサードとして機能するという事実を呼び出し元が認識してはならないため、ファサードでは特に間違った考えだと思います。

Provider は良さそうですが、私には DynamicSearchService の方が良さそうです。

于 2011-10-13T14:03:44.950 に答える
0

これは私の専門分野ではありませんが、戦略パターンのように聞こえると思います

于 2011-10-13T14:03:29.567 に答える