C++ 视图状态与应用程序设计

C++ 视图状态与应用程序设计,c++,model-view-controller,c++11,C++,Model View Controller,C++11,我有一个工具栏控制器,它能够通过查询文档属性或应用程序框架来更新工具栏状态(启用/禁用、按下/未按下)。我有一些表示视图当前状态的按钮 从应用程序设计的角度来看,我喜欢工具栏控制器能够在给定文档的任何时间更新按钮状态。我还希望工具栏控制器和按钮处理程序没有内部状态 我看到的选项-寻找其他建议: 创建一种机制,用于与访问者一起访问文档的所有视图,该访问者可以捕获视图的状态,然后用于启用/禁用/按下/按下按钮 在视图和工具栏处理程序之间创建一些连接,允许工具栏按钮直接询问视图 其他 您可以尝试为视

我有一个工具栏控制器,它能够通过查询文档属性或应用程序框架来更新工具栏状态(启用/禁用、按下/未按下)。我有一些表示视图当前状态的按钮

从应用程序设计的角度来看,我喜欢工具栏控制器能够在给定文档的任何时间更新按钮状态。我还希望工具栏控制器和按钮处理程序没有内部状态

我看到的选项-寻找其他建议:

  • 创建一种机制,用于与访问者一起访问文档的所有视图,该访问者可以捕获视图的状态,然后用于启用/禁用/按下/按下按钮
  • 在视图和工具栏处理程序之间创建一些连接,允许工具栏按钮直接询问视图
  • 其他

您可以尝试为视图创建一个事件循环,并使用函数调用调度更新状态

像这样:

class ViewEventArgs{
   public:
    int eventNumber;
};
class ViewEvent{
    public:
   virtual void onViewChange(ViewEventChangeArgs args) = 0;
};

class ViewController{
    public:
   virtual void doPressed() = 0;
   virtual void doChecked() = 0;
   //other interface methods
};

class ToolbarView : public ViewEvent{
   public:
   //Your EVENT-LOOP kernel will fire these events depending upon the state change in the view
   void onViewChange(ViewEventChangeArgs args)
   {
       switch(args.eventNumber){
    case PRESSED:
       getToolbarController()->doPressed();//the method dispatch
       break;
    case CHECKED:
       getToolbarController()->doChecked();
       }      
   }
    //other parts of the view
};

class ToolbarController: public ViewController{
    public:
       void doPressed() { /*pressed*/ }
       void doChecked() { /*checked*/ }
           //implementations
};

试着去理解。视图将通过函数调用Dispatch将其状态推送到工具栏控制器?这不需要工具栏控制器向视图注册吗?是的,您需要向视图注册。但这类似于View::setToolbarController(aToolBarController)。aToolBarController需要从纯虚拟类实现,只有虚拟方法[aka INTERFACE]。这将很好地设置分派机制,允许使用多个工具栏控制器。