
#include <iostream>
using namespace std;
class Strategy {
public:
virtual int doOperation(int a, int b) = 0;
};
//ConcreteStrategy
class AddStrategy: public Strategy {
public:
int doOperation(int a, int b) {
return a + b;
}
};
//ConcreteStrategy
class SubstractStrategy: public Strategy {
public:
int doOperation(int a, int b) {
return a - b;
}
};
//Context
class Calc {
Strategy* strategy = NULL;
public:
int execute(int a, int b) {
if (strategy == NULL)
return 0;
return strategy->doOperation(a, b);
}
void setStrategy(Strategy* strategy) {
this->strategy = strategy;
}
};
Calc calc;
int result1 = calc.execute(5, 3);
//result1 is 0
calc.setStrategy(new AddStrategy());
int result2 = calc.execute(5, 3);
//result2 is 8
calc.setStrategy(new SubstractStrategy());
int result3 = calc.execute(5, 3);
//result3 is 2
cout << "result1 is " << result1 << endl;
cout << "result2 is " << result2 << endl;
cout << "result3 is " << result3;
| Определяет семейство алгоритмов, инкапсулируя их и позволяя подставлять один вместо другого. Можно менять алгоритм независимо от клиента, который им пользуется. |