我想将此项目Qt Calculator Example分离到GUI模块和业务逻辑模块中。这样做的最佳方法是什么,最好只用C ++编写逻辑模块,以便我可以在其他IDE中使用它?
答案 0 :(得分:2)
您的案例中的最佳做法或设计模式是GRASP Controller模式。
在您的情况下 - 这意味着您应该完全将Calculator
课与Qt内容(例如QWidget
)分开。
所以 - 如果你需要提供从Calculator
到Qt小部件的东西 - 创建和使用CalculatorPresentationInterface
之类的界面。
要获得一些回调,GUI事件到计算器 - 制作回调槽或接口CalculatorConrollerInterface
。
所以 - 你的计算器将实现CalculatorConrollerInterface
以便能够从GUI接收事件。
使用dependency injection pattern通过Calculator
将CalculatorConrollerInterface
注入您的GUI。
您的GUI应该实现(或者您可以使用adapter pattern)CalculatorPresentationInterface
,然后通过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();
}