Сегодня разберем паттерн проектирования Стратегия (Strategy). Паттерн относится к группе паттернов поведения. Применяется в том случае когда нам надо инкапсулировать семейство алгоритмов, подставляя один в место другого, меня алгоритм вне зависимости от клиента. Ниже приводу пример на C++/C#.
#include <iostream> using namespace std; class Strategy { public: virtual void DoAlgo()=0; }; class Context { private: Strategy* strategy; public: Context(Strategy* strategy); void ExecuteStrategy(); }; Context::Context(Strategy* strategy) { this->strategy = strategy; } void Context::ExecuteStrategy() { return this->strategy->DoAlgo(); } class Sort : Strategy { public: void DoAlgo(); }; void Sort::DoAlgo() { cout<<"Iam do Sort yah-yah!!! xDDD"<<endl; } class Compute :Strategy { public: void DoAlgo(); }; void Compute::DoAlgo() { cout<<"Iam do Compute yah-yah!!! xDDD"<<endl; } int main() { Sort* sort=new Sort; Context* comp=new Context((Strategy*)sort); comp->ExecuteStrategy(); Context* comp2=new Context((Strategy*)&Compute()); comp2->ExecuteStrategy(); getchar(); return 0; }
Реализация на C#
public interface Strategy { void DoAlgo(); } class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void Execute() { this.strategy.DoAlgo(); } } public class Sort: Strategy { public void DoAlgo() { Console.WriteLine("I am sorting, really!!! xDDD"); } } public class Compute: Strategy { public void DoAlgo() { Console.WriteLine("I am computing, yah-yah!!! xDDD"); } } class Program { static void Main(string[] args) { Context context = new Context(new Sort()); Context context2 = new Context(new Compute()); context.Execute(); context2.Execute(); Console.ReadKey(); } }
Паттерн понятен.
Но не понятна польза от него.
В main совсем не вижу преимуществ этого патерна и его назначение.