Стратегія (англ. Strategy) — шаблон проєктування, належить до класу шаблонів поведінки. Відомий ще під іншою назвою — «Policy». Його суть полягає у тому, щоб створити декілька схем поведінки для одного об'єкту та винести в окремий клас. Шаблон Стратегія (Strategy) дозволяє міняти вибраний алгоритм незалежно від об'єктів-клієнтів, які його використовують.
Основні характеристики
Завдання
За типом клієнта (або за типом оброблюваних даних) вибрати відповідний алгоритм, який слід застосувати. Якщо використовується правило, яке не піддається змінам, немає необхідності звертатися до шаблону «стратегія».
Структура
Мотиви
- Програма повинна забезпечувати різні варіанти алгоритму або поведінки
- Потрібно змінювати поведінку кожного екземпляра класу
- Необхідно змінювати поведінку об'єктів на стадії виконання
- Введення інтерфейсу дозволяє класам-клієнтам нічого не знати про класи, що реалізують цей інтерфейс і інкапсулюють в собі конкретні алгоритми
Спосіб вирішення
Відділення процедури вибору алгоритму від його реалізації. Це дозволяє зробити вибір на підставі контексту.
Учасники
- Клас
Strategy
визначає, як будуть використовуватися різні алгоритми. - Конкретні класи
ConcreteStrategy
реалізують ці різні алгоритми. - Клас
Context
використовує конкретні класиConcreteStrategy
за допомогою посилання на конкретний тип абстрактного класуStrategy
. КласиStrategy
іContext
взаємодіють з метою реалізації обраного алгоритму (в деяких випадках класуStrategy
потрібно надсилати запити класуContext
). КласContext
пересилає класуStrategy
запит, що надійшов від його класу-клієнта.
Наслідки
- Шаблон Strategy визначає сімейство алгоритмів.
- Це дозволяє відмовитися від використання перемикачів і / або умовних операторів.
- Виклик всіх алгоритмів повинен здійснюватися стандартним чином (всі вони повинні мати однаковий інтерфейс).
Реалізація
Клас, який використовує алгоритм (Context
), включає абстрактний клас (Strategy
), що володіє абстрактним методом, визначальним спосіб виклику алгоритму. Кожен похідний клас реалізує один необхідний варіант алгоритму.
Використання
Архітектура Microsoft WDF заснована на цьому патерні. У кожного об'єкта «драйвер» і «пристрій» є незмінна частина, вшита в систему, в якій реєструється змінна частина (стратегія), написана в конкретній реалізації. Змінна частина може бути і зовсім порожньою, що означає, що драйвер нічого не робить, але при цьому здатний брати участь у PnP і управлінні живленням.
Бібліотека ATL містить у собі набір класів threading model, які є стратегіями (різними реалізаціями Lock / Unlock, які потім використовуються основними класами системи). При цьому в цих стратегіях використовується статичний поліморфізм через параметр шаблону, а не динамічний поліморфізм через віртуальні методи.
Призначення шаблону проєктування Стратегія
Існують системи, поведінка яких визначається відповідно до певного роду алгоритмів. Всі вони подібні між собою: призначені для вирішення спільних задач, мають однаковий інтерфейс для користування, але відрізняються тільки «поведінкою», тобто реалізацією. Користувач, налаштувавши програму на потрібний алгоритм — отримує потрібний результат.
- Приклад. Є програма(інтерфейс) через яку обраховується ціна на товар для покупців у яких є знижка та ціна за сезонною знижкою — обираємо необхідний алгоритм. Об'єктно-орієнтований дизайн такої програми будується на ідеї використання поліморфізму. Результатом є набір «класів-родичів» — у яких єдиний інтерфейс та різна реалізація алгоритмів.
- Недоліками такого алгоритму є те, що реалізація жорстко прив'язана до підкласу, що ускладнює внесення змін.
- Вирішенням даної проблеми є використання патерну Стратегія (Strategy).
Переваги та недоліки
Переваги
- Можливість позбутися умовних операторів.
- Клієнт може вибирати найбільш влучну стратегію залежно від вимог щодо швидкодії і пам'яті.
Недоліки
- Збільшення кількості об'єктів.
- Клієнт має знати особливості реалізацій стратегій для вибору найбільш вдалої.
Зв'язок з іншими патернами
- Стратегія змінює реалізацію, декоратор — доповнює
- В стратегії користувач знає про класи стратегій і міняє їх самостійно, в стані різноманітні стани приховані від користувача, а за їх заміну відповідає сам клас
- Міст — це структурний патерн. Його компоненти зазвичай встановлюються раз і не змінюються під час виконання програми. Використовують для розділення абстракції та реалізації. Стратегія — це шаблон поведінки. Використовують коли коли алгоритми можуть замінювати один одного під час виконання програми.
- Шаблонний метод задає кроки алгоритму, які реалізовують підкласи. Стратегія задає алгоритм який можна виконати декількома способами, до того ж вибрати ці способи на етапі виконання програми
Приклади
Приклад на Java
// Клас реалізує конкретну стратегію, повинен успадковувати цей інтерфейс // Клас контексту використовує цей інтерфейс для виклику конкретної стратегії interface Strategy { int execute(int a, int b); } // Реалізуємо алгоритм з використанням інтерфейсу стратегії class ConcreteStrategyAdd implements Strategy { public int execute(int a, int b) { System.out.println("Called ConcreteStrategyAdd's execute()"); return a + b; // Do an addition with a and b } } class ConcreteStrategySubtract implements Strategy { public int execute(int a, int b) { System.out.println("Called ConcreteStrategySubtract's execute()"); return a - b; // Do a subtraction with a and b } } class ConcreteStrategyMultiply implements Strategy { public int execute(int a, int b) { System.out.println("Called ConcreteStrategyMultiply's execute()"); return a * b; // Do a multiplication with a and b } } // Клас контексту використовує інтерфейс стратегії class Context { private Strategy strategy; // Constructor public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int a, int b) { return strategy.execute(a, b); } } // Тестовий додаток class StrategyExample { public static void main(String[] args) { Context context; context = new Context(new ConcreteStrategyAdd()); int resultA = context.executeStrategy(3,4); context = new Context(new ConcreteStrategySubtract()); int resultB = context.executeStrategy(3,4); context = new Context(new ConcreteStrategyMultiply()); int resultC = context.executeStrategy(3,4); } }
Приклад на
#include <iostream> using namespace std; // загальний спосіб вирішення проблеми struct NameStrategy { virtual void greet() = 0; }; // Конкретні рецепти вирішення struct SayHi : public NameStrategy { void greet() { cout << " Hi!How is it going ? " << endl; } }; struct Ignore : public NameStrategy { void greet() { cout << " (Pretend I do not see you)" << endl; } }; struct Admission : public NameStrategy { void greet() { cout << " I am sorry.I forgot your name." << endl; } }; // Контекст керує стратегією («Посередник») // «Стан» - якщо можлива зміна стратегії за життя контексту class Context { private: NameStrategy& strategy; public: Context(NameStrategy& strat) : strategy(strat) {} void greet() { strategy.greet(); } // постійний код }; void main() { SayHi sayhi; Ignore ignore; Admission admission; Context c1(sayhi), c2(ignore), c3(admission); c1.greet(); c2.greet(); c3.greet(); }
class Strategy { protected: Strategy(void){} public: virtual ~Strategy(void){} virtual void use(void) = 0; }; class Strategy_1: public Strategy { public: Strategy_1(){} ~Strategy_1(){} void use(void){ cout << "Strategy_1" << endl; }; }; class Strategy_2: public Strategy { public: Strategy_2(){} ~Strategy_2(){} void use(void){ cout << "Strategy_2" << endl; }; }; class Strategy_3: public Strategy { public: Strategy_3(){} ~Strategy_3(){} void use(void){ cout << "Strategy_3" << endl; }; }; class Context { protected: Strategy* operation; public: Context(void){} ~Context(void){} virtual void UseStrategy(void) = 0; virtual void SetStrategy(Strategy* v) = 0; }; class Client: public Context { public: Client(void){} ~Client(void){} void UseStrategy(void) { operation->use(); } void SetStrategy(Strategy* o) { operation = o; } }; int _tmain(int argc, _TCHAR* argv[]) { Client customClient; Strategy_1 str1; Strategy_2 str2; Strategy_3 str3; customClient.SetStrategy(&str1); customClient.UseStrategy(); customClient.SetStrategy(&str2); customClient.UseStrategy(); customClient.SetStrategy(&str3); customClient.UseStrategy(); return 0; }
Приклад на C #
using System; namespace DesignPatterns.Behavioral.Strategy { /// <summary> /// Інтерфейс «Стратегія» визначає функціональність (в даному прикладі це метод /// <see Cref="Algorithm"> Algorithm </see>), яка повинна бути реалізована /// конкретними класами стратегій. Іншими словами, метод інтерфейсу визначає /// вирішення якоїсь задачі, а його реалізації в конкретних класах стратегій визначають, /// яким шляхом ця задача буде вирішена. /// </ Summary> public interface IStrategy { void Algorithm(); } /// <summary> /// Перша конкретна реалізація-стратегія. /// </summary> public class ConcreteStrategy1 : IStrategy { public void Algorithm() { Console.WriteLine("Виконується алгоритм стратегії 1."); } } /// <summary> /// Друга конкретна реалізація-стратегія. /// Реалізацій може бути скільки завгодно багато. /// </Summary> public class ConcreteStrategy2 : IStrategy { public void Algorithm() { Console.WriteLine("Виконується алгоритм стратегії 2."); } } /// <summary> /// Контекст, використовує стратегію для вирішення свого завдання. /// </summary> public class Context { /// <summary> /// Посилання на інтерфейс <see cref="IStrategy">IStrategy</see> /// дозволяє автоматично перемикатися між конкретними реалізаціями /// (іншими словами, це вибір конкретної стратегії). /// </summary> private IStrategy _strategy; /// <summary> /// Конструктор контексту. /// Ініціалізує об'єкт стратегією. /// </summary> /// <param name="strategy"> /// Стратегія. /// </param> public Context(IStrategy strategy) { _strategy = strategy; } /// <summary> /// Метод для установки стратегії. /// Служить для зміни стратегії під час виконання. /// В C# може бути реалізований так само як властивість запису. /// </summary> /// <param name="strategy"> /// Нова стратегія. /// </param> public void SetStrategy(IStrategy strategy) { _strategy = strategy; } /// <summary> /// Деяка функціональність контексту, яка вибирає /// стратегію і використовує її для вирішення свого завдання. /// </summary> public void ExecuteOperation() { _strategy.Algorithm(); } } /// <summary> /// Клас додатка. /// У даному прикладі виступає як клієнт контексту. /// </summary> public static class Program { /// <summary> /// Точка входу в програму. /// </summary> public static void Main() { // Створюємо контекст і ініціалізували його першої стратегією. Context context = new Context(new ConcreteStrategy1()); // Виконуємо операцію контексту, яка використовує першу стратегію. context.ExecuteOperation(); // Замінюємо в контексті першу стратегію другою. context.SetStrategy(new ConcreteStrategy2()); // Виконуємо операцію контексту, яка тепер використовує другу стратегію. context.ExecuteOperation(); } } }
Приклади на D
import std.stdio; interface IStrategy { int Action(int a, int b); } class TAddition: IStrategy { public int Action(int a, int b) { return a+b; } } class TSubtraction: IStrategy { public int Action(int a, int b) { return a-b; } } class TContexet { private: int a, b; IStrategy strategy; public: void SetAB(int a, int b) { TContexet.a = a; TContexet.b = b; }; void SetStrategy(IStrategy strategy) { TContexet.strategy = strategy; } int Action() { return strategy.Action(a, b); } } void main() { TContexet context = new TContexet; context.SetAB(10, 5); context.SetStrategy(new TAddition); writeln(context.Action()); // 15 context.SetStrategy(new TSubtraction); writeln(context.Action()); // 5 }
Приклад на Delphi
program Strategy_pattern; {$APPTYPE CONSOLE} type IStrategy = interface ['{6105F24C-E5B2-47E5-BE03-835A894DEB42}'] procedure Algorithm; end; TConcreteStrategy1 = class(TInterfacedObject, IStrategy) public procedure Algorithm; end; procedure TConcreteStrategy1.Algorithm; begin Writeln('TConcreteStrategy1.Algorithm'); end; type TConcreteStrategy2 = class(TInterfacedObject, IStrategy) public procedure Algorithm; end; procedure TConcreteStrategy2.Algorithm; begin Writeln('TConcreteStrategy2.Algorithm'); end; type TContext = class private FStrategy: IStrategy; public procedure ContextMethod; property Strategy: IStrategy read FStrategy write FStrategy; end; procedure TContext.ContextMethod; begin FStrategy.Algorithm; end; var Context: TContext; begin Context := TContext.Create; try Context.Strategy := TConcreteStrategy1.Create; Context.ContextMethod; Context.Strategy := TConcreteStrategy2.Create; Context.ContextMethod; finally Context.Free; end; end.
Приклади на Javascript
// "інтерфейс" Strategy class Strategy { exec() {} } // реалізації Strategy // показ повідомлення в статусному рядку вебоглядача // (підтримується не всіма вебоглядачами) class StrategyWindowStatus extends Strategy { constructor() { super(); } exec(message) { window.status = message; } } class StrategyNewWindow extends Strategy { constructor() { super(); } exec(message) { const win = window.open("", "_blank"); win.document.write("<html>"+ message +"</html>"); } } // показ повідомлення за допомогою модального вікна class StrategyAlert extends Strategy { constructor() { super(); } exec(message) { alert(message); } } // Context class Context { constructor(strategy) { this.strategy = undefined; } exec(message) { this.strategy.exec(message); } } // Використання const showInWindowStatus = new Context( new StrategyWindowStatus() ); const showInNewWindow = new Context( new StrategyNewWindow() ); const showInAlert = new Context( new StrategyAlert() ); showInWindowStatus.exec("повідомлення"); showInNewWindow.exec("повідомлення"); showInAlert.exec("повідомлення");
Приклад з використанням динамічних (first-class) функцій
function Context(fn) { this.exec = function() { fn.apply(this, arguments || []); }; }; var showInWindowStatus = new Context( function(message) { window.status = message; } ); var showInNewWindow = new Context( function(message) { var win = window.open("", "_blank"); win.document.write("<html>"+ message +"</html>"); } ); var showInAlert = new Context( function(message) { alert(message); } ); showInWindowStatus.exec("повідомлення"); showInNewWindow.exec("повідомлення"); showInAlert.exec("повідомлення");
Приклади на PHP5
<?php interface NamingStrategy { function createName($filename); } class ZipFileNamingStrategy implements NamingStrategy { function createName($filename) { return "http://downloads.foo.bar/{$filename}.zip"; } } class TarGzFileNamingStrategy implements NamingStrategy { function createName($filename) { return "http://downloads.foo.bar/{$filename}.tar.gz"; } } class Context { private $namingStrategy; function __construct(NamingStrategy $strategy) { $this->namingStrategy = $strategy; } function execute() { $url[] = $this->namingStrategy->createName("Calc101"); $url[] = $this->namingStrategy->createName("Stat2000"); return $url; } } if (strstr($_SERVER["HTTP_USER_AGENT"], "Win")) $context = new Context(new ZipFileNamingStrategy()); else $context = new Context(new TarGzFileNamingStrategy()); $context->execute(); ?>
Приклад на Python
class People(object): tool = None def __init__(self, name): self.name = name def setTool(self, tool): self.tool = tool def write(self, text): self.tool.write(self.name, text) class ToolBase: """ Сімейство алгоритмів `Інструмент написання` """ def write(self, name, text): raise NotImplementedError class PenTool(ToolBase): """Ручка""" def write(self, name, text): print u'%s (ручкою) %s' % (name, text) class BrushTool(ToolBase): """Пензель""" def write(self, name, text): print u'%s (пензлем) %s' % (name, text) class Student(People): """Студент""" tool = PenTool() class Painter(People): """Художник""" tool = BrushTool() alexandr = Student(u'Олександр') alexandr.write(u'Пишу лекцію про шаблон Стратегія') # Олександр (ручкою) Пишу лекцію про шаблон Стратегія solomia = Painter(u'Соломія') solomia.write(u'Малюю ілюстрацію до шаблону Стратегія') # Соломія (пензлем) Малюю ілюстрацію до шаблону Стратегія # Соломія вирішила стати студентом solomia.setTool(PenTool()) solomia.write(u'Ні, вже краще я напишу конспект') # Соломія (ручкою) Ні, вже краще я напишу конспект
Висновки
Останнім часом розроблено багато мов програмування, але в кожній з них для досягнення найкращого результату роботи необхідно використовувати шаблони програмування, одним з яких є Стратегія (Strategy).
Джерела
Design Patterns: Elements of Reusable Object-Oriented Software [ 9 листопада 2012 у Wayback Machine.]
Література
- Bishop, Judith. C# 3.0 Design Patterns. Sebastopol, California: O'Reilly, 2008.
- Tomas Petricek, Jon Skeet. Functional Programming for the Real World. б.м.: Manning Publications, 2010.
Посилання
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Strategiya angl Strategy shablon proyektuvannya nalezhit do klasu shabloniv povedinki Vidomij she pid inshoyu nazvoyu Policy Jogo sut polyagaye u tomu shob stvoriti dekilka shem povedinki dlya odnogo ob yektu ta vinesti v okremij klas Shablon Strategiya Strategy dozvolyaye minyati vibranij algoritm nezalezhno vid ob yektiv kliyentiv yaki jogo vikoristovuyut Osnovni harakteristikiZavdannya Za tipom kliyenta abo za tipom obroblyuvanih danih vibrati vidpovidnij algoritm yakij slid zastosuvati Yaksho vikoristovuyetsya pravilo yake ne piddayetsya zminam nemaye neobhidnosti zvertatisya do shablonu strategiya Struktura Motivi Programa povinna zabezpechuvati rizni varianti algoritmu abo povedinki Potribno zminyuvati povedinku kozhnogo ekzemplyara klasu Neobhidno zminyuvati povedinku ob yektiv na stadiyi vikonannya Vvedennya interfejsu dozvolyaye klasam kliyentam nichogo ne znati pro klasi sho realizuyut cej interfejs i inkapsulyuyut v sobi konkretni algoritmi Sposib virishennya Viddilennya proceduri viboru algoritmu vid jogo realizaciyi Ce dozvolyaye zrobiti vibir na pidstavi kontekstu Uchasniki Klas Strategy viznachaye yak budut vikoristovuvatisya rizni algoritmi Konkretni klasi ConcreteStrategy realizuyut ci rizni algoritmi Klas Context vikoristovuye konkretni klasi ConcreteStrategy za dopomogoyu posilannya na konkretnij tip abstraktnogo klasu Strategy Klasi Strategy i Context vzayemodiyut z metoyu realizaciyi obranogo algoritmu v deyakih vipadkah klasu Strategy potribno nadsilati zapiti klasu Context Klas Context peresilaye klasu Strategy zapit sho nadijshov vid jogo klasu kliyenta Naslidki Shablon Strategy viznachaye simejstvo algoritmiv Ce dozvolyaye vidmovitisya vid vikoristannya peremikachiv i abo umovnih operatoriv Viklik vsih algoritmiv povinen zdijsnyuvatisya standartnim chinom vsi voni povinni mati odnakovij interfejs Realizaciya Klas yakij vikoristovuye algoritm Context vklyuchaye abstraktnij klas Strategy sho volodiye abstraktnim metodom viznachalnim sposib vikliku algoritmu Kozhen pohidnij klas realizuye odin neobhidnij variant algoritmu Vikoristannya Arhitektura Microsoft WDF zasnovana na comu paterni U kozhnogo ob yekta drajver i pristrij ye nezminna chastina vshita v sistemu v yakij reyestruyetsya zminna chastina strategiya napisana v konkretnij realizaciyi Zminna chastina mozhe buti i zovsim porozhnoyu sho oznachaye sho drajver nichogo ne robit ale pri comu zdatnij brati uchast u PnP i upravlinni zhivlennyam Biblioteka ATL mistit u sobi nabir klasiv threading model yaki ye strategiyami riznimi realizaciyami Lock Unlock yaki potim vikoristovuyutsya osnovnimi klasami sistemi Pri comu v cih strategiyah vikoristovuyetsya statichnij polimorfizm cherez parametr shablonu a ne dinamichnij polimorfizm cherez virtualni metodi Priznachennya shablonu proyektuvannya Strategiya Isnuyut sistemi povedinka yakih viznachayetsya vidpovidno do pevnogo rodu algoritmiv Vsi voni podibni mizh soboyu priznacheni dlya virishennya spilnih zadach mayut odnakovij interfejs dlya koristuvannya ale vidriznyayutsya tilki povedinkoyu tobto realizaciyeyu Koristuvach nalashtuvavshi programu na potribnij algoritm otrimuye potribnij rezultat Priklad Ye programa interfejs cherez yaku obrahovuyetsya cina na tovar dlya pokupciv u yakih ye znizhka ta cina za sezonnoyu znizhkoyu obirayemo neobhidnij algoritm Ob yektno oriyentovanij dizajn takoyi programi buduyetsya na ideyi vikoristannya polimorfizmu Rezultatom ye nabir klasiv rodichiv u yakih yedinij interfejs ta rizna realizaciya algoritmiv Nedolikami takogo algoritmu ye te sho realizaciya zhorstko priv yazana do pidklasu sho uskladnyuye vnesennya zmin Virishennyam danoyi problemi ye vikoristannya paternu Strategiya Strategy Perevagi ta nedoliki Perevagi Mozhlivist pozbutisya umovnih operatoriv Kliyent mozhe vibirati najbilsh vluchnu strategiyu zalezhno vid vimog shodo shvidkodiyi i pam yati Nedoliki Zbilshennya kilkosti ob yektiv Kliyent maye znati osoblivosti realizacij strategij dlya viboru najbilsh vdaloyi Zv yazok z inshimi paternami Strategiya zminyuye realizaciyu dekorator dopovnyuye V strategiyi koristuvach znaye pro klasi strategij i minyaye yih samostijno v stani riznomanitni stani prihovani vid koristuvacha a za yih zaminu vidpovidaye sam klas Mist ce strukturnij patern Jogo komponenti zazvichaj vstanovlyuyutsya raz i ne zminyuyutsya pid chas vikonannya programi Vikoristovuyut dlya rozdilennya abstrakciyi ta realizaciyi Strategiya ce shablon povedinki Vikoristovuyut koli koli algoritmi mozhut zaminyuvati odin odnogo pid chas vikonannya programi Shablonnij metod zadaye kroki algoritmu yaki realizovuyut pidklasi Strategiya zadaye algoritm yakij mozhna vikonati dekilkoma sposobami do togo zh vibrati ci sposobi na etapi vikonannya programiPrikladiPriklad na Java Priklad realizaciyi Klas realizuye konkretnu strategiyu povinen uspadkovuvati cej interfejs Klas kontekstu vikoristovuye cej interfejs dlya vikliku konkretnoyi strategiyi interface Strategy int execute int a int b Realizuyemo algoritm z vikoristannyam interfejsu strategiyi class ConcreteStrategyAdd implements Strategy public int execute int a int b System out println Called ConcreteStrategyAdd s execute return a b Do an addition with a and b class ConcreteStrategySubtract implements Strategy public int execute int a int b System out println Called ConcreteStrategySubtract s execute return a b Do a subtraction with a and b class ConcreteStrategyMultiply implements Strategy public int execute int a int b System out println Called ConcreteStrategyMultiply s execute return a b Do a multiplication with a and b Klas kontekstu vikoristovuye interfejs strategiyi class Context private Strategy strategy Constructor public Context Strategy strategy this strategy strategy public int executeStrategy int a int b return strategy execute a b Testovij dodatok class StrategyExample public static void main String args Context context context new Context new ConcreteStrategyAdd int resultA context executeStrategy 3 4 context new Context new ConcreteStrategySubtract int resultB context executeStrategy 3 4 context new Context new ConcreteStrategyMultiply int resultC context executeStrategy 3 4 Priklad na C Priklad realizaciyi include lt iostream gt using namespace std zagalnij sposib virishennya problemi struct NameStrategy virtual void greet 0 Konkretni recepti virishennya struct SayHi public NameStrategy void greet cout lt lt Hi How is it going lt lt endl struct Ignore public NameStrategy void greet cout lt lt Pretend I do not see you lt lt endl struct Admission public NameStrategy void greet cout lt lt I am sorry I forgot your name lt lt endl Kontekst keruye strategiyeyu Poserednik Stan yaksho mozhliva zmina strategiyi za zhittya kontekstu class Context private NameStrategy amp strategy public Context NameStrategy amp strat strategy strat void greet strategy greet postijnij kod void main SayHi sayhi Ignore ignore Admission admission Context c1 sayhi c2 ignore c3 admission c1 greet c2 greet c3 greet Priklad realizaciyi class Strategy protected Strategy void public virtual Strategy void virtual void use void 0 class Strategy 1 public Strategy public Strategy 1 Strategy 1 void use void cout lt lt Strategy 1 lt lt endl class Strategy 2 public Strategy public Strategy 2 Strategy 2 void use void cout lt lt Strategy 2 lt lt endl class Strategy 3 public Strategy public Strategy 3 Strategy 3 void use void cout lt lt Strategy 3 lt lt endl class Context protected Strategy operation public Context void Context void virtual void UseStrategy void 0 virtual void SetStrategy Strategy v 0 class Client public Context public Client void Client void void UseStrategy void operation gt use void SetStrategy Strategy o operation o int tmain int argc TCHAR argv Client customClient Strategy 1 str1 Strategy 2 str2 Strategy 3 str3 customClient SetStrategy amp str1 customClient UseStrategy customClient SetStrategy amp str2 customClient UseStrategy customClient SetStrategy amp str3 customClient UseStrategy return 0 Priklad na C Priklad realizaciyi using System namespace DesignPatterns Behavioral Strategy lt summary gt Interfejs Strategiya viznachaye funkcionalnist v danomu prikladi ce metod lt see Cref Algorithm gt Algorithm lt see gt yaka povinna buti realizovana konkretnimi klasami strategij Inshimi slovami metod interfejsu viznachaye virishennya yakoyis zadachi a jogo realizaciyi v konkretnih klasah strategij viznachayut yakim shlyahom cya zadacha bude virishena lt Summary gt public interface IStrategy void Algorithm lt summary gt Persha konkretna realizaciya strategiya lt summary gt public class ConcreteStrategy1 IStrategy public void Algorithm Console WriteLine Vikonuyetsya algoritm strategiyi 1 lt summary gt Druga konkretna realizaciya strategiya Realizacij mozhe buti skilki zavgodno bagato lt Summary gt public class ConcreteStrategy2 IStrategy public void Algorithm Console WriteLine Vikonuyetsya algoritm strategiyi 2 lt summary gt Kontekst vikoristovuye strategiyu dlya virishennya svogo zavdannya lt summary gt public class Context lt summary gt Posilannya na interfejs lt see cref IStrategy gt IStrategy lt see gt dozvolyaye avtomatichno peremikatisya mizh konkretnimi realizaciyami inshimi slovami ce vibir konkretnoyi strategiyi lt summary gt private IStrategy strategy lt summary gt Konstruktor kontekstu Inicializuye ob yekt strategiyeyu lt summary gt lt param name strategy gt Strategiya lt param gt public Context IStrategy strategy strategy strategy lt summary gt Metod dlya ustanovki strategiyi Sluzhit dlya zmini strategiyi pid chas vikonannya V C mozhe buti realizovanij tak samo yak vlastivist zapisu lt summary gt lt param name strategy gt Nova strategiya lt param gt public void SetStrategy IStrategy strategy strategy strategy lt summary gt Deyaka funkcionalnist kontekstu yaka vibiraye strategiyu i vikoristovuye yiyi dlya virishennya svogo zavdannya lt summary gt public void ExecuteOperation strategy Algorithm lt summary gt Klas dodatka U danomu prikladi vistupaye yak kliyent kontekstu lt summary gt public static class Program lt summary gt Tochka vhodu v programu lt summary gt public static void Main Stvoryuyemo kontekst i inicializuvali jogo pershoyi strategiyeyu Context context new Context new ConcreteStrategy1 Vikonuyemo operaciyu kontekstu yaka vikoristovuye pershu strategiyu context ExecuteOperation Zaminyuyemo v konteksti pershu strategiyu drugoyu context SetStrategy new ConcreteStrategy2 Vikonuyemo operaciyu kontekstu yaka teper vikoristovuye drugu strategiyu context ExecuteOperation Prikladi na D Priklad realizaciyi import std stdio interface IStrategy int Action int a int b class TAddition IStrategy public int Action int a int b return a b class TSubtraction IStrategy public int Action int a int b return a b class TContexet private int a b IStrategy strategy public void SetAB int a int b TContexet a a TContexet b b void SetStrategy IStrategy strategy TContexet strategy strategy int Action return strategy Action a b void main TContexet context new TContexet context SetAB 10 5 context SetStrategy new TAddition writeln context Action 15 context SetStrategy new TSubtraction writeln context Action 5 Priklad na Delphi Priklad realizaciyi program Strategy pattern APPTYPE CONSOLE type IStrategy interface 6105F24C E5B2 47E5 BE03 835A894DEB42 procedure Algorithm end TConcreteStrategy1 class TInterfacedObject IStrategy public procedure Algorithm end procedure TConcreteStrategy1 Algorithm begin Writeln TConcreteStrategy1 Algorithm end type TConcreteStrategy2 class TInterfacedObject IStrategy public procedure Algorithm end procedure TConcreteStrategy2 Algorithm begin Writeln TConcreteStrategy2 Algorithm end type TContext class private FStrategy IStrategy public procedure ContextMethod property Strategy IStrategy read FStrategy write FStrategy end procedure TContext ContextMethod begin FStrategy Algorithm end var Context TContext begin Context TContext Create try Context Strategy TConcreteStrategy1 Create Context ContextMethod Context Strategy TConcreteStrategy2 Create Context ContextMethod finally Context Free end end Prikladi na Javascript Priklad realizaciyi interfejs Strategy class Strategy exec realizaciyi Strategy pokaz povidomlennya v statusnomu ryadku veboglyadacha pidtrimuyetsya ne vsima veboglyadachami class StrategyWindowStatus extends Strategy constructor super exec message window status message class StrategyNewWindow extends Strategy constructor super exec message const win window open blank win document write lt html gt message lt html gt pokaz povidomlennya za dopomogoyu modalnogo vikna class StrategyAlert extends Strategy constructor super exec message alert message Context class Context constructor strategy this strategy undefined exec message this strategy exec message Vikoristannya const showInWindowStatus new Context new StrategyWindowStatus const showInNewWindow new Context new StrategyNewWindow const showInAlert new Context new StrategyAlert showInWindowStatus exec povidomlennya showInNewWindow exec povidomlennya showInAlert exec povidomlennya Priklad z vikoristannyam dinamichnih first class funkcij Priklad realizaciyi function Context fn this exec function fn apply this arguments var showInWindowStatus new Context function message window status message var showInNewWindow new Context function message var win window open blank win document write lt html gt message lt html gt var showInAlert new Context function message alert message showInWindowStatus exec povidomlennya showInNewWindow exec povidomlennya showInAlert exec povidomlennya Prikladi na PHP5 Priklad realizaciyi lt php interface NamingStrategy function createName filename class ZipFileNamingStrategy implements NamingStrategy function createName filename return http downloads foo bar filename zip class TarGzFileNamingStrategy implements NamingStrategy function createName filename return http downloads foo bar filename tar gz class Context private namingStrategy function construct NamingStrategy strategy this gt namingStrategy strategy function execute url this gt namingStrategy gt createName Calc101 url this gt namingStrategy gt createName Stat2000 return url if strstr SERVER HTTP USER AGENT Win context new Context new ZipFileNamingStrategy else context new Context new TarGzFileNamingStrategy context gt execute gt Priklad na Python Priklad realizaciyi class People object tool None def init self name self name name def setTool self tool self tool tool def write self text self tool write self name text class ToolBase Simejstvo algoritmiv Instrument napisannya def write self name text raise NotImplementedError class PenTool ToolBase Ruchka def write self name text print u s ruchkoyu s name text class BrushTool ToolBase Penzel def write self name text print u s penzlem s name text class Student People Student tool PenTool class Painter People Hudozhnik tool BrushTool alexandr Student u Oleksandr alexandr write u Pishu lekciyu pro shablon Strategiya Oleksandr ruchkoyu Pishu lekciyu pro shablon Strategiya solomia Painter u Solomiya solomia write u Malyuyu ilyustraciyu do shablonu Strategiya Solomiya penzlem Malyuyu ilyustraciyu do shablonu Strategiya Solomiya virishila stati studentom solomia setTool PenTool solomia write u Ni vzhe krashe ya napishu konspekt Solomiya ruchkoyu Ni vzhe krashe ya napishu konspektVisnovkiOstannim chasom rozrobleno bagato mov programuvannya ale v kozhnij z nih dlya dosyagnennya najkrashogo rezultatu roboti neobhidno vikoristovuvati shabloni programuvannya odnim z yakih ye Strategiya Strategy DzherelaDesign Patterns Elements of Reusable Object Oriented Software 9 listopada 2012 u Wayback Machine LiteraturaBishop Judith C 3 0 Design Patterns Sebastopol California O Reilly 2008 Tomas Petricek Jon Skeet Functional Programming for the Real World b m Manning Publications 2010 Posilannyahttp code tutsplus com uk tutorials design patterns the strategy pattern cms 22796 5 bereznya 2016 u Wayback Machine