2

私は外部サーバー用の完全なクライアントの作成に携わったのはこれが初めてです(私はパターンの設計に非常に慣れていません)。

このサーバーは、REST、SOAPなど、コマンドを接続して送信するためのいくつかのプロトコルを提供します。

これらのプロトコルはすべて、ほぼ同じ一連のアクションを実行しますが、違いがあります。これらすべてのプロトコルをサポートする完全なクライアントフレームワークを設計および実装する必要があります。

いくつかのインターネットリンクを理解して通過したように、私には抽象的なファクトリパターンとインターフェイスを使用しているように見えます。

それを実装するための私の現在の考えは次のとおりです。

  1. Connection(ConnectionFactory)の抽象ファクトリクラスを作成します。入力に基づいて、使用するプロトコルに言及し、それぞれの接続オブジェクトが作成されます。この抽象クラスには、抽象メソッド(processMessage)があります。このメソッドは、すべてのプロトコルの接続クラスに実装する必要があります。この単一のメソッド(processMessage)は、実行する要求のタイプに言及する引数を取ります。プロトコルごとに個別のリクエスト名があります。定数を使用してどのように処理できますか?

  2. 要求、応答、およびクライアントのインターフェースを定義します。すべてのプロトコルには、それぞれのインターフェイスを実装する独自のRequest、Response、およびClientクラスがあります。

このデザインについての貴重なご意見をお聞かせください。ここでできるもっと良いことを教えてください。それでもディレクトリ構造を完成させることができません。同じように助けてください。

4

1 に答える 1

2

さまざまなプロトコルのクラス階層を定義することを計画している場合は、データ型(要求、応答など)の並列階層を作成しないようにしてください。これはしばしばアンチパターンと見なされ、「並列継承階層」と呼ばれます。これが質問の例です。このアプローチの主な欠点は、複数の並列クラス階層を維持する必要があることです。

接続ファクトリを作成することは合理的に聞こえます。サーバーにメッセージを送信するためのメソッドcreateMessage()とサーバーからメッセージを受信するためのprocessMessage()を持つクラスインスタンスを返す可能性が高く、ファクトリは次に説明するProtocolHandlerをプラグインします。

リクエストとレスポンスに関しては、ストラテジーパターンを使用してConnectionクラスにProtocolHandlerメンバーを定義できます。これにより、各実装は、それぞれのプロトコル(REST、SOAPなど)の詳細を処理、解析、マーシャリングなどできるクラスになります。 。ConnectionクラスのprocessMessage()メソッドとcreateMessage()メソッドは、ProtocolHandlerクラス階層を使用します。

これがC++のいくつかの擬似コードです。私はそれをコンパイルもテストもしていませんが、Imが何を説明しようとしているのかについての良いアイデアが得られることを願っています。

// Your factory will create the Connection instance and fill in the
// corresponding ProtocolHandler concrete implementation instance

class Connection
{
public:
    // Depending on what else you need for the Connection,
    // the constructors may be different
    Connection() : handler_(NULL) {}
    Connection(ProtocolHandler *handler) : handler_(handler) {}

    inline void setProtocolHandler(ProtocolHandler *handler) {handler_ = handler;}
    inline ProtocolHandler *getProtocolHandler() {return handler_;}

    void processMessage(const string &msg) {
        handler_->decode(msg);
        // any extra logic here
    }

    string createMessage() {
        // any extra logic here
        return handler_->encode();
    }

    // Put the rest of your connection stuff here

private:
    ProtocolHandler *handler_;

};

// Notice that Im handling the protocol msg buffers in a std::string, this
// may or may not work for you, replace accordingly depending on your needs

class ProtocolHandler
{
public:

    // abstract methods
    // name these accordingly as handle, parse, marshal, etc
    virtual string encode() = 0;
    virtual void decode(const string &msg) = 0;

    // Other methods you may need here
};

class RestProtocolHandler : public ProtocolHandler
{
public:
    virtual string encode() { /* your rest msg encode impl here */ }
    virtual void decode(const string &msg) { /* your rest msg decode impl here */ }

    // Other methods and/or attributes you may need here
};

// More concrete ProtocolHandler implementations here
于 2012-06-20T06:50:13.347 に答える