【发布时间】:2011-03-25 08:36:34
【问题描述】:
我在标题中有如下内容
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++ 语言功能重新设计)重构此代码的最佳方式是什么?
我已经读到命令模式通常用于重构 switch 语句,但这似乎只适用于在算法之间进行选择以执行任务。这是工厂或抽象工厂模式适用的地方吗(我也不是很熟悉)?双重派送?
我已尝试尽可能多地省略无关紧要的上下文,但如果我错过了重要的内容,请告诉我,我会进行编辑以包含它。另外,我找不到任何类似的东西,但如果这是重复的,只需将我重定向到适当的 SO 问题。
【问题讨论】:
-
访问者模式很适合替换像这样的开关。
-
@neoneye:访问者模式基于两个现有对象的动态类型实现了双分派。在这种情况下,我们需要确定要创建哪种类型的对象。
标签: c++ design-patterns refactoring