Яка різниця між схемою розробки стратегії та схемою державного дизайну?


219

Які відмінності між схемою розробки стратегії та схемою державного дизайну? Я переглядав досить багато статей в Інтернеті, але не зміг чітко визначити різницю.

Може хтось, будь ласка, пояснить різницю в умовах непростої людини?


Виходячи з відповідей тут та моїх власних спостережень, здається, що реалізація значною мірою (хоча і не повністю) однакова. Скоріше, різниця головним чином полягає в намірі: ми намагаємось адаптувати поведінку, або на основі нашого стану (модель держави), або на основі чогось іншого (стратегія). Досить часто щось інше - це "те, що вибирає клієнт", через ін'єкцію.
Тимо

Відповіді:


139

Чесно кажучи, обидві моделі дуже схожі на практиці, і визначальна різниця між ними, як правило, змінюється залежно від того, кого ви запитуєте. Деякі популярні варіанти:

  • Штати зберігають посилання на контекстний об'єкт, який їх містить. Стратегії цього не роблять.
  • Державам дозволяється замінювати себе (IE: змінювати стан контекстного об'єкта на щось інше), тоді як Стратегії - ні.
  • Стратегії передаються контекстному об'єкту як параметри, тоді як стани створюються самим контекстним об'єктом.
  • Стратегії вирішують лише одне конкретне завдання, тоді як держави забезпечують основну реалізацію для всього (або більшості всього) контекстного об'єкта.

"Класична" реалізація відповідатиме державі або Стратегії для кожного елемента списку, але ви натрапляєте на гібриди, які мають суміш обох. Незалежно від того, чи є конкретна більш державою-y чи стратегією -Y, це врешті-решт суб'єктивне питання.


6
Якщо ви вважаєте GoF одним із популярних варіантів, вони не погоджуються з тим, що штати обов'язково створюються контекстом (можуть бути створені клієнтом і передані в контекст, подібно до стратегії).
Вілл Хардвік-Сміт

109
  • Стратегія картина дійсно про те , іншу реалізацію , яка завершувала ( в основному) те ж саме, так що одна реалізація може замінити інший , як стратегія вимагає. Наприклад, у вас можуть бути різні алгоритми сортування у стратегії. Викликаючі до об'єкта не змінюються залежно від того, яка стратегія використовується, але незалежно від стратегії мета однакова (сортування колекції).
  • Державна картина про робити різні речі в залежності від стану, залишаючи при цьому абонент звільнений від тягаря розміщення кожних з можливих станів. Так, наприклад, у вас може бути getStatus()метод, який повертає різні статуси залежно від стану об'єкта, але абонент методу не повинен кодуватися по-різному, щоб враховувати кожен потенційний стан.

1
але хто змінює стратегію у схемі стратегії ??
Нур

1
@ Ні, зазвичай це якийсь параметр або поле. Фактичний код абонента не змінюється на основі зміни стратегії.
Ісіхай

4
@ Ні, так, але в будь-якій схемі стратегії, про яку я можу подумати зараз, це буде рішення наперед, яке не зміниться в середині.
Ісіхай

2
Я з тією ж проблемою, держава чи стратегія, я думаю, що різниця в кількох словах - стан, поведінка автоматично визначається, стратегія, поведінка визначається абонентом.
Рене МФ

1
У додатку електронної комерції, якщо додаткова знижка потрібно застосовувати у святковий сезон, то це державний дизайн. Фактична логіка ставки дисконтування може бути застосована із схемою розробки стратегії, якщо існує більше ніж один спосіб досягти цієї кількості.
Бхараткумар V

85

Різниця просто полягає в тому, що вони вирішують різні проблеми:

  • Зображення стану стосується того, що (стан або тип) є об'єктом (в) - воно інкапсулює поведінку, залежне від стану, тоді як
  • в стратегії модель розглядається як об'єкт виконує певне завдання - він інкапсулює алгоритм.

Однак конструкції для досягнення цих різних цілей дуже схожі; обидва зразки - приклади композиції з делегуванням.


Деякі спостереження щодо їх переваг:

Використовуючи державний зразок державно-холдинг (контекст) клас звільняються від знання якого стану або типу це і які стани або типів, які доступні. Це означає, що клас дотримується принципу відкритого закритого проектування (OCP): клас закритий для змін у тому, які стани / типи існують, але стани / типи відкриті для розширень.

За допомогою шаблону стратегії клас, що використовує алгоритм (контекст), позбавляється від знань, як виконати певне завдання (- "алгоритм"). Цей випадок також створює прихильність до OCP; клас закритий для змін щодо виконання цього завдання, але дизайн дуже відкритий для доповнень інших алгоритмів для вирішення цього завдання.
Це, ймовірно, також покращує дотримання контекстного класу принципу єдиної відповідальності (SRP). Далі алгоритм стає легкодоступним для повторного використання іншими класами.


42

Може хтось, будь-ласка, пояснить у мирян?

Шаблони дизайну насправді не є "мирянськими" поняттями, але я постараюся зробити це максимально зрозумілим. Будь-яку модель дизайну можна розглядати в трьох вимірах:

  1. Проблема, яку вирішує шаблон;
  2. Статична структура візерунка (класова діаграма);
  3. Динаміка шаблону (діаграми послідовності).

Порівняємо державу та стратегію.

Завдання, яку вирішує шаблон

Держава використовується в одному з двох випадків [книга GoF, с. 306] :

  • Поведінка об'єкта залежить від його стану, і він повинен змінювати свою поведінку під час виконання, залежно від цього стану.
  • Операції мають великі, багаточастинні умовні висловлювання, які залежать від стану об'єкта. Цей стан зазвичай представлений однією або кількома перерахованими константами. Часто кілька операцій будуть містити цю ж умовну структуру. Державний зразок ставить кожну гілку умовного в окремий клас. Це дозволяє розглядати стан об'єкта як власний об'єкт, який може відрізнятися незалежно від інших об'єктів.

Якщо ви хочете переконатися, що ви справді маєте проблему, яку вирішує шаблон структури, ви повинні мати змогу моделювати стани об'єкта за допомогою машини з кінцевим станом . Ви можете знайти застосований приклад тут .

Кожен стан переходу є методом у державному інтерфейсі. Це означає, що для дизайну ви повинні бути досить впевнені в переходах стану, перш ніж застосовувати цей шаблон. В іншому випадку, якщо ви додасте або видалите переходи, це вимагатиме зміни інтерфейсу та всіх класів, які його реалізують.

Я особисто не вважаю цю модель корисною. Ви завжди можете реалізовувати машини кінцевого стану за допомогою таблиці пошуку (це не спосіб OO, але він працює досить добре).

Стратегія використовується для наступного [книга GoF, с. 316] :

  • багато пов'язаних класів відрізняються лише своєю поведінкою. Стратегії - це спосіб налаштувати клас з однією з багатьох форм поведінки.
  • потрібні різні варіанти алгоритму. Наприклад, ви можете визначити алгоритми, які відображають різні компроміси простору / часу. Стратегії можна використовувати, коли ці варіанти реалізуються як ієрархія класів алгоритмів [HO87].
  • алгоритм використовує дані, про які клієнти не повинні знати. Використовуйте шаблон стратегії, щоб уникнути викриття складних, алгоритмних структур даних.
  • клас визначає багато поведінки, і вони з'являються як множинні умовні висловлювання в його операціях. Замість багатьох умовних умов перемістіть відповідні умовні гілки у власний клас стратегії.

Останній випадок, коли потрібно застосувати Стратегію, пов'язаний з рефакторингом, відомим як Замінити умовним поліморфізмом .

Резюме: Держава та стратегія вирішують дуже різні проблеми. Якщо вашу проблему неможливо змоделювати за допомогою машини з кінцевим станом, то ймовірна модель стану не підходить. Якщо ваша проблема не стосується інкапсуляції варіантів складного алгоритму, стратегія не застосовується.

Статична структура візерунка

State має таку структуру класів UML:

Діаграма класу PlantUML типу "Державний зразок"

Стратегія має таку структуру класів UML:

Діаграма класу PlantUML стратегії

Підсумок: з точки зору статичної структури ці дві закономірності здебільшого однакові. Насправді такі інструменти для виявлення шаблонів, як ця, вважають, що " структура шаблонів [...] однакова, забороняючи їх розрізнення автоматичним процесом (наприклад, без посилання на концептуальну інформацію) ".

Однак може бути велика різниця, якщо ConcreteStates вирішують самі переходи стану (див. Асоціації " можуть визначити " на діаграмі вище). Це призводить до сполучення між конкретними станами. Наприклад (див. Наступний розділ) стан A визначає перехід у стан B. Якщо клас контексту вирішує перехід до наступного конкретного стану, ці залежності відходять.

Динаміка візерунка

Як було сказано у розділі Проблема вище, стан передбачає, що поведінка змінюється під час виконання залежно від стану об'єкта. Тому поняття переходу стану застосовується, як обговорювалося відношення машини кінцевих станів . [GoF] згадує, що переходи можна визначити або в підкласах ConcreteState, або в централізованому розташуванні (наприклад, на основі таблиці).

Припустимо просту машину з кінцевим станом:

Діаграма переходу стану PlantUML з двома станами та одним переходом

Припускаючи, що підкласи вирішують перехід стану (повертаючи наступний об'єкт стану), динаміка виглядає приблизно так:

Діаграма послідовностей PlantUML для переходів стану

Щоб показати динаміку Стратегії , корисно запозичити реальний приклад .

Діаграма послідовностей PlantUML для переходів стратегії

Короткий зміст : Кожен шаблон використовує поліморфний виклик, щоб зробити щось залежно від контексту. У режимі стану поліморфний виклик (перехід) часто викликає зміну наступного стану . У шаблоні стратегії поліморфний виклик зазвичай не змінює контекст (наприклад, один раз оплата кредитною карткою не означає, що наступний раз ви будете платити PayPal). Знову ж таки, динаміка структури держави визначається відповідною машиною fininte state, яка (для мене) має важливе значення для корекції застосування цього шаблону.


Ця відповідь була дуже корисною для мене, щоб змусити мене відрізняти різницю. Аргумент стану машини здається відповідним IMHO. Це фактично підсумовує наведені відповіді теоретично інформатикою.
medunes

Ця відповідь дуже корисна, для мене це найкраще.
Chofoteddy

25

Шаблон стратегії передбачає переміщення реалізації алгоритму з хостинг класу та розміщення його в окремому класі. Це означає, що хост-класу не потрібно забезпечувати реалізацію кожного алгоритму, що може призвести до нечистого коду.

Алгоритми сортування зазвичай використовуються як приклад, оскільки всі вони роблять те саме (сортування). Якщо кожен різний алгоритм сортування розміщений у своєму власному класі, то клієнт може легко вибрати, який алгоритм використовувати, і шаблон пропонує простий спосіб доступу до нього.

Модель стану передбачає зміну поведінки об'єкта, коли стан об'єкта змінюється. Це означає, що хост-клас не забезпечує реалізацію поведінки для всіх різних станів, в яких він може перебувати. Хост-клас зазвичай інкапсулює клас, який забезпечує функціонал, необхідний у заданому стані, і переходить на інший клас коли стан змінюється.


16

Розглянемо систему IVR (Interactive Voice Response), яка обробляє дзвінки клієнтів. Ви можете запрограмувати його для обробки клієнтів на:

  • Робочі дні
  • Свята

Щоб вирішити цю ситуацію, ви можете використовувати шаблон держави .

  • Свято : IVR просто відповідає, кажучи, що " Дзвінки можна приймати лише в робочі дні між 9:00 та 17:00 ".
  • Робочі дні : він відповідає, підключаючи замовника до виконавця служби обслуговування.

Цей процес підключення замовника до виконавчого апарату підтримки може бути реалізований за допомогою " Шаблону стратегії", де керівники вибираються на основі будь-якого з:

  • Кругової
  • Найменше нещодавно використані
  • Інші алгоритми, засновані на пріоритеті

Шаблон стратегії визначає " як " виконати якусь дію, а зразок стану визначає " коли " для їх виконання.


Це відмінна відповідь і недооцінена. Але було б корисно згадати, чому у вашому прикладі є потреба у багатьох алгоритмах. Наприклад, алгоритм вибирається виходячи з переваг компанії Call Center. Це також допоможе, якби у вашому списку були більш прості або тривіальні алгоритми для тих, хто не знає RR або LRU. Наприклад - Клієнт, який тривалий час отримує більший пріоритет, замовник, який чекав найбільше, отримує більш високий пріоритет. Дякую !
MasterJoe2

14

Стратегія являє собою об'єкти, які щось "роблять", з однаковими результатами початку та кінця, але внутрішньо з використанням різних методологій. У цьому сенсі вони аналогічні репрезентації дієслова. Державний зразок OTOH використовує об'єкти, які "є" чимось - стан операції. Хоча вони також можуть представляти операції над цими даними, вони більш аналогічні представленню іменника, ніж дієслова, і налаштовані на стан машини.


11

Стратегія: стратегія є фіксованою і зазвичай складається з декількох етапів. (Сортування становить лише один крок, і тому є дуже поганим прикладом, оскільки воно є занадто примітивним, щоб зрозуміти мету цієї закономірності). Ваша "основна" рутина в стратегії - це виклик кількох абстрактних методів. Наприклад, "Введіть стратегію кімнати", "основний метод" - це goThroughDoor (), який виглядає так: pristupDoor (), якщо (заблокований ()) openLock (); відкриті двері(); enterRoom (); повернути (); closeDoor (); if (wasLocked ()) lockDoor ();

Тепер підкласи цього загального «алгоритму» для переміщення з однієї кімнати в іншу через можливі заблоковані двері можуть реалізувати кроки алгоритму.

Іншими словами, підкласифікація стратегії не змінює основні алгоритми, а лише окремі кроки.

ТО, ЩО ВИНАГАЄ шаблон шаблону методу. Тепер покладіть кроки, що належать разом (розблокування / блокування та відкриття / закриття), у власні об’єкти реалізації та делегуйте їм. Наприклад, замок з ключем, а замок з кодовою карткою - це два види замків. Делегуйте від стратегії об’єкти "Крок". Тепер у вас є стратегія.

Державний зразок - це щось зовсім інше.

У вас є об'єкт, що обгортає, і обгорнутий об'єкт. Загорнутий - це «держава». До об'єкту стану доступно лише через його обгортку. Тепер ви можете в будь-який час змінити обернутий об'єкт, таким чином, начебто, обгортка може змінити свій стан, або навіть свій "клас" або тип.

Наприклад, у вас є послуга входу. Він приймає ім’я користувача та пароль. Він має лише один метод: logon (String userName, String passwdHash). Замість того, щоб самостійно вирішувати, прийнятий чи ні реєстраційний запис, він делегує рішення об'єкту держави. Цей об'єкт стану зазвичай просто перевіряє, чи є комбінація користувача / пропуску дійсною та виконує вхід. Але тепер ви можете обміняти "Шашку" на одну, яка дозволяє лише приватним користувачам увійти (наприклад, під час основного обслуговування), або на одну, яка нікому не дозволяє входити. Це означає, що "шашка" виражає "статус реєстрації" системи.

Найголовніша відмінність: коли ви вибрали стратегію, дотримуйтесь її, поки не закінчите її. Це означає, що ви називаєте його "основним методом", і поки він працює, ви ніколи не змінюєте стратегію. OTOH у ситуації, що склалася, під час виконання вашої системи ви змінюєте стан довільно, як вважаєте за потрібне.


9

Шаблон стратегії використовується, коли у вас є кілька алгоритмів для конкретної задачі, і клієнт вирішує фактичну реалізацію, яку слід використовувати під час виконання.

Діаграма UML з статті вікі- стратегії:

введіть тут опис зображення

Ключові риси:

  1. Це поведінковий зразок.
  2. Він заснований на делегуванні.
  3. Він змінює кишки об'єкта, змінюючи поведінку методу.
  4. Він використовується для перемикання між сімейством алгоритмів.
  5. Це змінює поведінку об'єкта під час виконання.

Докладнішу інформацію та приклади реального світу див. У цій публікації:

Приклад реального світу стратегії

Державний шаблон дозволяє об'єктщоб змінити свою поведінкуколи його внутрішній стан змінюється

Діаграма UML зі статті Вікі про державний зразок:

введіть тут опис зображення

Якщо нам доведеться змінити поведінку об'єкта на основі його стану, ми можемо мати змінну стану в Об'єкті і використовувати блок умов if-else для виконання різних дій на основі стану. Державний зразок використовується для забезпечення систематичного способу досягнення цього способу шляхом реалізації контексту та стану .

Докладнішу інформацію див. У цій статті журналу .

Основні відмінності від sourcemaking і journaldev статей:

  1. Різниця між державою та стратегією полягає в обов'язковому часі. Стратегія є закономірною одноразовою схемою, тоді як держава є більш динамічною .
  2. Різниця між державою та стратегією полягає у намірі. Завдяки стратегії вибір алгоритму досить стабільний . З Державою зміна стану об'єкта "контекст" змушує його вибирати зі своєї "палітри" об'єктів Стратегії .
  3. Контекст містить стан як змінну екземпляра, і може бути кілька завдань, реалізація яких може залежати від стану, тоді як у стратегії шаблону стратегії передається як аргумент методу, а об'єкт контексту не має змінної для його зберігання.

5

Мовою мирян,

у структурі стратегії немає держав або всі вони мають однаковий стан. У кожного є різні способи виконання завдання, як і різні лікарі по-різному ставляться до одного і того ж хвороби одного і того ж хворого з одним станом.

У Шаблоні стану суб'єктивно є такі стани, як поточний стан пацієнта (скажімо, висока температура або низька температура), на основі якого буде прийнято наступний курс дії (рецепт ліків). І один стан може призвести до іншого стану, тому стан є до державної залежності (склад технічно).

Якщо ми технічно спробуємо це зрозуміти, грунтуючись на порівнянні кодів обох, ми можемо втратити суб'єктивність ситуації, оскільки обидва виглядають дуже схоже.


2

Обидва шаблони делегуються до базового класу, який має декілька похідних, але лише у шарі стану ці похідні класи містять посилання на контекстний клас.

Іншим способом дивитися на це є те, що шаблон Стратегії - це більш простий варіант моделі держави; під-шаблон, якщо вам подобається. Це дійсно залежить, хочете ви, щоб похідні стани містили посилання на контекст чи ні (тобто: чи хочете ви, щоб вони викликали методи в контексті).

Для отримання додаткової інформації: Роберт С. Мартін (& Міка Мартін) відповідають на це у своїй книзі "Спритні принципи, закономірності та практики в C #". ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )


2

Це досить давнє запитання, але все ж я також шукав однакові відповіді, і це те, що я виявив.

Для моделі "Шаблон" давайте розглянемо приклад кнопки "Відтворення медіа-плеєра". Коли ми граємо, вона починає грати і дає зрозуміти контексту, що вона грає. Кожен раз, коли клієнт хоче виконати операцію гри, він перевіряє поточний стан гравця. Тепер клієнт знає, що стан об'єкта відтворюється через контекстний об'єкт, тому він викликає метод паузи стану об'єктів, що діяє. Частина клієнта, що усвідомлює стан і про те, в якому стані йому потрібно зробити дії, може бути автоматизована.

https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm

У випадку шаблону стратегії розташування діаграми класів таке ж, як і схема стану. Клієнт приходить до цієї домовленості зробити деяку операцію. Тобто замість різних станів існують різні алгоритми, наприклад, різний аналіз, який потрібно виконати за схемою. Тут клієнти повідомляють контексту, що він хоче робити, який алгоритм (визначений спеціальним алгоритмом для бізнесу), а потім виконує це.

https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

Обидва реалізують принцип відкритого закриття, тому розробник має можливість додавати нові стани до структури стану та нового алгоритму.

Але відмінність полягає в тому, що вони використовуються, а це - зразок стану, який використовується для виконання різної логіки на основі стану об'єкта. А у випадку стратегії інша логіка.


2

Держава має невеликі залежності в класах, похідних від держави: як одна держава знає про інші держави, що йдуть після неї. Наприклад, літо настає після зими для будь-якого сезону, або стан доставки після стану депозиту для покупок.

З іншого боку, Стратегія не має подібних залежностей. Тут будь-який стан може бути ініціалізований на основі типу програми / продукту.


1

Різниця обговорюється в http://c2.com/cgi/wiki?StrategyPattern . Я використовував схему стратегії для дозволу вибору різних алгоритмів у загальних рамках для аналізу даних. Завдяки цьому ви можете додавати алгоритми, не змінюючи загальну структуру та її логіку.

Типовим прикладом є те, що у вас Емі є рамка для оптимізації функції. Рамка встановлює дані та параметри. Шаблон стратегії дозволяє вибирати такі алгоритми, як найсильніші спуски, спряжені градієнти, BFGS тощо, не змінюючи рамки.


1

І стратегія, і держава мають однакову структуру. Якщо ви подивитеся на діаграму класів UML для обох моделей, вони виглядають абсолютно однаково, але їх наміри абсолютно різні. Шаблон дизайну стану використовується для визначення та управління станом об'єкта, тоді як шаблон стратегії використовується для визначення набору взаємозамінних алгоритмів і дозволяє клієнту вибрати один з них. Таким чином, стратегія - це модель, керована клієнтом, тоді як Object може сам керувати там станом.


1

Коротше кажучи, за допомогою шаблону стратегії ми можемо задавати деяку поведінку на ходу, маючи стан стану, ми можемо бути впевнені, що об’єкт змінить свою поведінку внутрішньо зі зміною свого стану.


0

Коли у вас є проект, який можна розділити на 2 завдання:

завдання 1: ви можете використовувати один з двох різних алгоритмів для виконання: alg1, alg2

завдання 2: ви можете використовувати один з трьох різних алгоритмів для виконання: alg3, alg4, alg5

alg1 і alg2 взаємозамінні; alg3, alg4 і alg5 взаємозамінні.

Вибір алгоритму для виконання завдання 1 та 2 залежить від станів:

стан 1: вам потрібно alg1 у завданні 1 та alg3 у завданні 2

стан 2: вам потрібно alg2 у завданні 1 та alg5 у завданні 2

У контексті ви можете змінити об'єкт стану з стану 1 на стан 2. Тоді ваше завдання буде виконано alg2 та alg5, а не alg1 та alg3.

Ви можете додати більше взаємозамінних алгоритмів для завдання 1 або завдання 2. Це шаблон стратегії.

Ви можете мати більше станів із різною комбінацією алгоритмів у завданні 1 та завданні 2. Зразок стану дозволяє переходити з одного стану в інший та виконувати різні комбінації алгоритмів.


0

"Стратегія" - це лише алгоритм, який ви можете змінювати за різних потреб, і він обробляє щось для вас. Вих. ви можете вибрати, як стискати файл. zip або rar ... методом.

Але "Держава" МОЖЕ змінити всю вашу поведінку об'єкта, коли вона змінюється. Навіть вона може змінити інші поля ... ось чому вона має посилання на свого власника. Ви повинні помітити, що зміна об'єктного поля може взагалі змінити поведінку об'єкта. Вих. коли ви змінюєте State0 на State1 в obj, ви змінюєте ціле число на 10 .. тому, коли ми викликаємо obj.f0 (), який робить деякий обчислення і використовує це ціле число, це впливає на результат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.