среда, 5 февраля 2014 г.

Стратегия/Политика(Strategy/Policy)

Идея: инкапсулировать алгоритм с возможностью замены алгоритма во время выполнения

#include <iostream>
using namespace std;

class BaseStrategy
{
public:
virtual ~BaseStrategy() {}
virtual void use(int *a) = 0;
};

class Strategy1 : public BaseStrategy
{
public:
virtual void use(int *a) { cout << "Strategy1" << endl; cout << (*a += 33) << endl;}
};

class Strategy2 : public BaseStrategy
{
public:
virtual void use(int *a) { cout << "Strategy2" << endl; cout << (*a += 6) << endl;}
};

class Strategy3 : public BaseStrategy
{
public:
virtual void use(int* a) { cout << "Strategy3" << endl; cout << (*a += 18) << endl;}
};

class BaseComposition
{
public:
virtual ~BaseComposition() {}
virtual void setStragy(BaseStrategy*) = 0;
virtual void use() = 0;

protected:
BaseStrategy* ptr;
};

class Composition : public BaseComposition
{
public:
Composition(int a) : num(a) {}
virtual void setStragy(BaseStrategy* ptr) { BaseComposition::ptr = ptr; }
virtual void use() { ptr->use(&num); }

private:
int num;
};

int main()
{
Composition obj(20);
Strategy1 str1;
Strategy2 str2;
Strategy3 str3;

obj.setStragy(&str1);
obj.use();

obj.setStragy(&str2);
obj.use();

obj.setStragy(&str3);
obj.use();

return 0;
}

Комментариев нет:

Отправить комментарий