我有一些像在頭設計模式重構switch語句
class MsgBase
{
public:
unsigned int getMsgType() const { return type_; }
...
private:
enum Types { MSG_DERIVED_1, MSG_DERIVED_2, ... MSG_DERIVED_N };
unsigned int type_;
...
};
class MsgDerived1 : public MsgBase { ... };
class MsgDerived2 : public MsgBase { ... };
...
class MsgDerivedN : public MsgBase { ... };
以下,並用作
MsgBase msgHeader;
// peeks into the input stream to grab the
// base class that has the derived message type
// non-destructively
inputStream.deserializePeek(msgHeader);
unsigned int msgType = msgHeader.getMsgType();
MsgDerived1 msgDerived1;
MsgDerived2 msgDerived2;
...
MsgDerivedN msgDerivedN;
switch(msgType)
{
case MSG_DERIVED_1:
// fills out msgDerived1 from the inputStream
// destructively
inputStream.deserialize(msgDerived1);
/* do MsgDerived1 processing */
break;
case MSG_DERIVED_2:
inputStream.deserialize(msgDerived2);
/* do MsgDerived1 processing */
break;
...
case MSG_DERIVED_N:
inputStream.deserialize(msgDerivedN);
/* do MsgDerived1 processing */
break;
}
這似乎是這將是相當普遍的良好形勢的類型適合重構。應用設計模式(或基本的C++語言特性重新設計)來重構此代碼的最佳方式是什麼?
我讀過Command模式通常用於重構switch語句,但似乎只適用於在執行任務的算法之間進行選擇。這是一個工廠還是抽象工廠模式適用的地方(我對此不是很熟悉)?雙派遣?
我試圖忽略儘可能多的無關緊要的上下文,但如果我錯過了一些重要的事情,請讓我知道,我將編輯以包含它。此外,我找不到任何類似的東西,但如果這是重複的,只是將我重定向到適當的SO問題。
訪客模式很適合替換像這樣的開關。 – neoneye 2010-08-04 16:01:55
@neoneye:訪客模式基於兩個現有對象的動態類型實現雙重調度。在這種情況下,我們需要確定要創建哪種類型的對象。 – 2010-08-04 16:42:26