Qt GUI和业务逻辑模块

时间:2016-03-09 12:55:36

标签: c++ qt module calculator

我想将此项目Qt Calculator Example分离到GUI模块和业务逻辑模块中。这样做的最佳方法是什么,最好只用C ++编写逻辑模块,以便我可以在其他IDE中使用它?

1 个答案:

答案 0 :(得分:2)

您的案例中的最佳做法或设计模式是GRASP Controller模式。

在您的情况下 - 这意味着您应该完全将Calculator课与Qt内容(例如QWidget)分开。

所以 - 如果你需要提供从Calculator到Qt小部件的东西 - 创建和使用CalculatorPresentationInterface之类的界面。

要获得一些回调,GUI事件到计算器 - 制作回调槽或接口CalculatorConrollerInterface

所以 - 你的计算器将实现CalculatorConrollerInterface以便能够从GUI接收事件。

使用dependency injection pattern通过CalculatorCalculatorConrollerInterface注入您的GUI。

您的GUI应该实现(或者您可以使用adapter patternCalculatorPresentationInterface,然后通过CalculatorPresentationInterface将您的GUI注入真正的Calculator课程。

通过这种方式,两个层的业务逻辑层(计算器)和表示逻辑(Qt GUI)将彼此分离,您可以轻松地交换两个层。

一个例子(每个类在单独的文件中)。

接口:

 class CalculatorConrollerInterface
 {
 public:
     virtual void onAdd() = 0;
     virtual void onCurrentNumberChange(int number) = 0;
 };
 class CalculatorPresentationInterface
 {
 public:
     virtual void showResult(int result) = 0;
 };

计算器 - 不得与Qt连接:

 class Calculator  : public CalculatorConrollerInterface
 {
 public:
      Calculator(CalculatorPresentationInterface& presentation)
        : presentation(presentation)
      {}
     virtual void onAdd() override
     { 
        // no idea this is correct - just example
        previousNumber = previousNumber + currentNumber;
        currentNumber = 0;
        presentation.showResult(previousNumber );
     }

     void onCurrentNumberChange(int number) override
     {
          currentNumber  = number;
     }
private:
      CalculatorPresentationInterface& presentation;
      // all stuff necessary to calculate
      int previousNumber;
      int currentNumber;
 };

计算器的Qt演示:

 class QtCalculatorPresentation : public CalculatorPresentationInterface
 {
 public:
     void setController(CalculatorConrollerInterface& controller)
     {
        this->controller = &controller;
     }
     void showResult(int result) override;

 private:
    CalculatorConrollerInterface* controller;
    // plus all Qt widgets necessary
    // and they shall forward any event to controller
 };

你的主要人物:

 #include "Calculator.hpp"
 #include "QtCalculatorPresentation .hpp"

 int main()
 {
      // dependency injections
      QtCalculatorPresentation  qtPresentation;
      Calculator calculator(qtPresentation);
      qtPresentation.setController(calculator);

      qtPresentation.exec();
 }