0

我正在使用观察者设计模式并从运行良好的模型更新 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)
    {

    }
}
4

0 回答 0