我正在使用观察者设计模式并从运行良好的模型更新 GUI。对于来自 GUI 的每个操作或函数调用,模型会在各个阶段发送一系列更新,以通知 GUI 相应地进行更新。这导致 UpdateView() 方法中的 if-else 块相当大。这是应该的还是可以通过应用另一种设计模式来改进?我将消息从每个函数拆分到不同的处理程序,这很有帮助。注意:代码未在下面编译,但我掌握了我正在做的事情的本质。我研究了一段时间的设计模式,但我是第一次实现它。
class Msg
{
int operation;
int opCode;
}
// in the model class
Device::Calibrate()
{
Msg msg;
msg.operation = CALIBRATE;
// ..... do some work -----
msg.opCode = DEPENDENT_MODULE_NOT_LOADED;
Notify( msg )
// .... do some work ------
msg.opCode = HARDWARE_MODULE_1_FAILED
Notify( msg )
// .... do some work ------
msg.opCode = CALIBRATION_IN_PROGRESS
Notify( msg )
// --- so on -----
}
void CMainDlg::UpdateView(const Msg * msg )
{
if( msg->operation == VERIFY ) // all message from Verify() button pressed
OnVerify( msg );
if( msg->operation == CALIBRATE ) // all messages from Calibrate button pressed
OnCalibrate();
}
void CMainDlg::OnCalibrate(const Msg * msg)
{
if (msg->opCode == DEPENDENT_MODULE_NOT_LOADED)
{
}
else if msg->opCode == HARDWARE_MODULE_1_FAILED)
{
}
else if msg->opCode == HARDWARE_MODULE_2_FAILED)
{
}
else if msg->opCode == CALIBRATION_IN_PROGRESS)
{
}
else if msg->opCode == OUTPUT_FILE_COULD_NOT_BE_CREATED)
{
}
else if msg->opCode == CALIBRATION_FAILED)
{
}
else if msg->opCode == CALIBRATION_PASSED)
{
}
}