さまざまなプロトコルのクラス階層を定義することを計画している場合は、データ型(要求、応答など)の並列階層を作成しないようにしてください。これはしばしばアンチパターンと見なされ、「並列継承階層」と呼ばれます。これが質問の例です。このアプローチの主な欠点は、複数の並列クラス階層を維持する必要があることです。
接続ファクトリを作成することは合理的に聞こえます。サーバーにメッセージを送信するためのメソッド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