//
// Created by win10 on 2021/11/16.
//
#include <thread>
#include <iostream>
using namespace std;
// 策略基类
class COperation {
public:
COperation() = default;
virtual ~COperation() = default;
virtual double getResult() = 0;
protected:
int m_first;
int m_second;
};
// 策略具体类
class AddOperation: public COperation {
public:
AddOperation(int first, int second) {
this->m_first = first;
this->m_second = second;
};
virtual ~AddOperation() = default;
virtual double getResult() override {
return this->m_first + this->m_second;
}
};
class SubOperation: public COperation {
public:
SubOperation(int first, int second) {
this->m_first = first;
this->m_second = second;
}
virtual ~SubOperation() = default;
virtual double getResult() override {
return this->m_first - this->m_second;
}
};
class MultiOperation: public COperation {
public:
MultiOperation(int first, int second) {
this->m_first = first;
this->m_second = second;
}
virtual ~MultiOperation() = default;
virtual double getResult() override {
return this->m_first * this->m_second;
}
};
class Context {
public:
Context(int firstValue, int secondValue, char operationType) {
switch (operationType) {
case '+': {
this->m_operationFunctionObj = new AddOperation(firstValue, secondValue);
break;
}
case '-': {
this->m_operationFunctionObj = new SubOperation(firstValue, secondValue);
break;
}
case '*': {
this->m_operationFunctionObj = new MultiOperation(firstValue, secondValue);
break;
}
default:
throw std::exception(string(string("Bad operationType: ") + operationType).c_str());
}
}
double getResult() {
return this->m_operationFunctionObj->getResult();
}
virtual ~Context() {
if (this->m_operationFunctionObj != nullptr) {
delete this->m_operationFunctionObj;
this->m_operationFunctionObj = nullptr;
}
}
private:
COperation* m_operationFunctionObj;
};
int main() {
Context* context = new Context(10, 5, '*');
std::cout << context->getResult() << std::endl;
delete context;
return 0;
}