如果您計劃爲不同協議定義類層次結構,請儘量避免爲數據類型(請求,響應等)創建並行層次結構。這通常被認爲是反模式,被稱爲「並行繼承層次結構」。這裏是一個例子question。這種方法的主要缺點是必須維護多個並行類層次結構。
創建連接工廠聽起來很合理。它應該最有可能將消息發送到服務器和而processMessage()用於接收消息從服務器和工廠將插件ProtocolHandler解釋下一個返回具有方法的CreateMessage一個類的實例()。
至於請求和響應,您可以使用Strategy pattern在Connection類中定義一個ProtocolHandler成員,其中每個實現都可以處理,解析,編組等等各個協議的詳細信息(REST,SOAP等)。 Connection類processMessage()和createMessage()方法將使用ProtocolHandler類層次結構。
這裏是一些在C++中的僞代碼,我沒有編譯也沒有測試過它,但我希望它能給你一個關於我試圖解釋什麼的好主意。
// 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
很好的回覆!感謝您的及時答覆。 – rpg
@rpg,謝謝,很高興幫助。 – Brady
請提出一個問題。在你的第一段中,你提到了不具有不同協議的類層次結構。在這種情況下,我如何爲每個協議分別設置一個請求和響應類。如果可能的話,我會請你請分享一些僞代碼。 – rpg