Які відмінності між схемою розробки стратегії та схемою державного дизайну? Я переглядав досить багато статей в Інтернеті, але не зміг чітко визначити різницю.
Може хтось, будь ласка, пояснить різницю в умовах непростої людини?
Які відмінності між схемою розробки стратегії та схемою державного дизайну? Я переглядав досить багато статей в Інтернеті, але не зміг чітко визначити різницю.
Може хтось, будь ласка, пояснить різницю в умовах непростої людини?
Відповіді:
Чесно кажучи, обидві моделі дуже схожі на практиці, і визначальна різниця між ними, як правило, змінюється залежно від того, кого ви запитуєте. Деякі популярні варіанти:
"Класична" реалізація відповідатиме державі або Стратегії для кожного елемента списку, але ви натрапляєте на гібриди, які мають суміш обох. Незалежно від того, чи є конкретна більш державою-y чи стратегією -Y, це врешті-решт суб'єктивне питання.
getStatus()
метод, який повертає різні статуси залежно від стану об'єкта, але абонент методу не повинен кодуватися по-різному, щоб враховувати кожен потенційний стан.Різниця просто полягає в тому, що вони вирішують різні проблеми:
Однак конструкції для досягнення цих різних цілей дуже схожі; обидва зразки - приклади композиції з делегуванням.
Деякі спостереження щодо їх переваг:
Використовуючи державний зразок державно-холдинг (контекст) клас звільняються від знання якого стану або типу це і які стани або типів, які доступні. Це означає, що клас дотримується принципу відкритого закритого проектування (OCP): клас закритий для змін у тому, які стани / типи існують, але стани / типи відкриті для розширень.
За допомогою шаблону стратегії клас, що використовує алгоритм (контекст), позбавляється від знань, як виконати певне завдання (- "алгоритм"). Цей випадок також створює прихильність до OCP; клас закритий для змін щодо виконання цього завдання, але дизайн дуже відкритий для доповнень інших алгоритмів для вирішення цього завдання.
Це, ймовірно, також покращує дотримання контекстного класу принципу єдиної відповідальності (SRP). Далі алгоритм стає легкодоступним для повторного використання іншими класами.
Може хтось, будь-ласка, пояснить у мирян?
Шаблони дизайну насправді не є "мирянськими" поняттями, але я постараюся зробити це максимально зрозумілим. Будь-яку модель дизайну можна розглядати в трьох вимірах:
Порівняємо державу та стратегію.
Держава використовується в одному з двох випадків [книга GoF, с. 306] :
- Поведінка об'єкта залежить від його стану, і він повинен змінювати свою поведінку під час виконання, залежно від цього стану.
- Операції мають великі, багаточастинні умовні висловлювання, які залежать від стану об'єкта. Цей стан зазвичай представлений однією або кількома перерахованими константами. Часто кілька операцій будуть містити цю ж умовну структуру. Державний зразок ставить кожну гілку умовного в окремий клас. Це дозволяє розглядати стан об'єкта як власний об'єкт, який може відрізнятися незалежно від інших об'єктів.
Якщо ви хочете переконатися, що ви справді маєте проблему, яку вирішує шаблон структури, ви повинні мати змогу моделювати стани об'єкта за допомогою машини з кінцевим станом . Ви можете знайти застосований приклад тут .
Кожен стан переходу є методом у державному інтерфейсі. Це означає, що для дизайну ви повинні бути досить впевнені в переходах стану, перш ніж застосовувати цей шаблон. В іншому випадку, якщо ви додасте або видалите переходи, це вимагатиме зміни інтерфейсу та всіх класів, які його реалізують.
Я особисто не вважаю цю модель корисною. Ви завжди можете реалізовувати машини кінцевого стану за допомогою таблиці пошуку (це не спосіб OO, але він працює досить добре).
Стратегія використовується для наступного [книга GoF, с. 316] :
- багато пов'язаних класів відрізняються лише своєю поведінкою. Стратегії - це спосіб налаштувати клас з однією з багатьох форм поведінки.
- потрібні різні варіанти алгоритму. Наприклад, ви можете визначити алгоритми, які відображають різні компроміси простору / часу. Стратегії можна використовувати, коли ці варіанти реалізуються як ієрархія класів алгоритмів [HO87].
- алгоритм використовує дані, про які клієнти не повинні знати. Використовуйте шаблон стратегії, щоб уникнути викриття складних, алгоритмних структур даних.
- клас визначає багато поведінки, і вони з'являються як множинні умовні висловлювання в його операціях. Замість багатьох умовних умов перемістіть відповідні умовні гілки у власний клас стратегії.
Останній випадок, коли потрібно застосувати Стратегію, пов'язаний з рефакторингом, відомим як Замінити умовним поліморфізмом .
Резюме: Держава та стратегія вирішують дуже різні проблеми. Якщо вашу проблему неможливо змоделювати за допомогою машини з кінцевим станом, то ймовірна модель стану не підходить. Якщо ваша проблема не стосується інкапсуляції варіантів складного алгоритму, стратегія не застосовується.
State має таку структуру класів UML:
Стратегія має таку структуру класів UML:
Підсумок: з точки зору статичної структури ці дві закономірності здебільшого однакові. Насправді такі інструменти для виявлення шаблонів, як ця, вважають, що " структура шаблонів [...] однакова, забороняючи їх розрізнення автоматичним процесом (наприклад, без посилання на концептуальну інформацію) ".
Однак може бути велика різниця, якщо ConcreteStates вирішують самі переходи стану (див. Асоціації " можуть визначити " на діаграмі вище). Це призводить до сполучення між конкретними станами. Наприклад (див. Наступний розділ) стан A визначає перехід у стан B. Якщо клас контексту вирішує перехід до наступного конкретного стану, ці залежності відходять.
Як було сказано у розділі Проблема вище, стан передбачає, що поведінка змінюється під час виконання залежно від стану об'єкта. Тому поняття переходу стану застосовується, як обговорювалося відношення машини кінцевих станів . [GoF] згадує, що переходи можна визначити або в підкласах ConcreteState, або в централізованому розташуванні (наприклад, на основі таблиці).
Припустимо просту машину з кінцевим станом:
Припускаючи, що підкласи вирішують перехід стану (повертаючи наступний об'єкт стану), динаміка виглядає приблизно так:
Щоб показати динаміку Стратегії , корисно запозичити реальний приклад .
Короткий зміст : Кожен шаблон використовує поліморфний виклик, щоб зробити щось залежно від контексту. У режимі стану поліморфний виклик (перехід) часто викликає зміну наступного стану . У шаблоні стратегії поліморфний виклик зазвичай не змінює контекст (наприклад, один раз оплата кредитною карткою не означає, що наступний раз ви будете платити PayPal). Знову ж таки, динаміка структури держави визначається відповідною машиною fininte state, яка (для мене) має важливе значення для корекції застосування цього шаблону.
Шаблон стратегії передбачає переміщення реалізації алгоритму з хостинг класу та розміщення його в окремому класі. Це означає, що хост-класу не потрібно забезпечувати реалізацію кожного алгоритму, що може призвести до нечистого коду.
Алгоритми сортування зазвичай використовуються як приклад, оскільки всі вони роблять те саме (сортування). Якщо кожен різний алгоритм сортування розміщений у своєму власному класі, то клієнт може легко вибрати, який алгоритм використовувати, і шаблон пропонує простий спосіб доступу до нього.
Модель стану передбачає зміну поведінки об'єкта, коли стан об'єкта змінюється. Це означає, що хост-клас не забезпечує реалізацію поведінки для всіх різних станів, в яких він може перебувати. Хост-клас зазвичай інкапсулює клас, який забезпечує функціонал, необхідний у заданому стані, і переходить на інший клас коли стан змінюється.
Розглянемо систему IVR (Interactive Voice Response), яка обробляє дзвінки клієнтів. Ви можете запрограмувати його для обробки клієнтів на:
Щоб вирішити цю ситуацію, ви можете використовувати шаблон держави .
Цей процес підключення замовника до виконавчого апарату підтримки може бути реалізований за допомогою " Шаблону стратегії", де керівники вибираються на основі будь-якого з:
Шаблон стратегії визначає " як " виконати якусь дію, а зразок стану визначає " коли " для їх виконання.
Стратегія являє собою об'єкти, які щось "роблять", з однаковими результатами початку та кінця, але внутрішньо з використанням різних методологій. У цьому сенсі вони аналогічні репрезентації дієслова. Державний зразок OTOH використовує об'єкти, які "є" чимось - стан операції. Хоча вони також можуть представляти операції над цими даними, вони більш аналогічні представленню іменника, ніж дієслова, і налаштовані на стан машини.
Стратегія: стратегія є фіксованою і зазвичай складається з декількох етапів. (Сортування становить лише один крок, і тому є дуже поганим прикладом, оскільки воно є занадто примітивним, щоб зрозуміти мету цієї закономірності). Ваша "основна" рутина в стратегії - це виклик кількох абстрактних методів. Наприклад, "Введіть стратегію кімнати", "основний метод" - це goThroughDoor (), який виглядає так: pristupDoor (), якщо (заблокований ()) openLock (); відкриті двері(); enterRoom (); повернути (); closeDoor (); if (wasLocked ()) lockDoor ();
Тепер підкласи цього загального «алгоритму» для переміщення з однієї кімнати в іншу через можливі заблоковані двері можуть реалізувати кроки алгоритму.
Іншими словами, підкласифікація стратегії не змінює основні алгоритми, а лише окремі кроки.
ТО, ЩО ВИНАГАЄ шаблон шаблону методу. Тепер покладіть кроки, що належать разом (розблокування / блокування та відкриття / закриття), у власні об’єкти реалізації та делегуйте їм. Наприклад, замок з ключем, а замок з кодовою карткою - це два види замків. Делегуйте від стратегії об’єкти "Крок". Тепер у вас є стратегія.
Державний зразок - це щось зовсім інше.
У вас є об'єкт, що обгортає, і обгорнутий об'єкт. Загорнутий - це «держава». До об'єкту стану доступно лише через його обгортку. Тепер ви можете в будь-який час змінити обернутий об'єкт, таким чином, начебто, обгортка може змінити свій стан, або навіть свій "клас" або тип.
Наприклад, у вас є послуга входу. Він приймає ім’я користувача та пароль. Він має лише один метод: logon (String userName, String passwdHash). Замість того, щоб самостійно вирішувати, прийнятий чи ні реєстраційний запис, він делегує рішення об'єкту держави. Цей об'єкт стану зазвичай просто перевіряє, чи є комбінація користувача / пропуску дійсною та виконує вхід. Але тепер ви можете обміняти "Шашку" на одну, яка дозволяє лише приватним користувачам увійти (наприклад, під час основного обслуговування), або на одну, яка нікому не дозволяє входити. Це означає, що "шашка" виражає "статус реєстрації" системи.
Найголовніша відмінність: коли ви вибрали стратегію, дотримуйтесь її, поки не закінчите її. Це означає, що ви називаєте його "основним методом", і поки він працює, ви ніколи не змінюєте стратегію. OTOH у ситуації, що склалася, під час виконання вашої системи ви змінюєте стан довільно, як вважаєте за потрібне.
Шаблон стратегії використовується, коли у вас є кілька алгоритмів для конкретної задачі, і клієнт вирішує фактичну реалізацію, яку слід використовувати під час виконання.
Діаграма UML з статті вікі- стратегії:
Ключові риси:
Докладнішу інформацію та приклади реального світу див. У цій публікації:
Приклад реального світу стратегії
Державний шаблон дозволяє об'єктщоб змінити свою поведінкуколи його внутрішній стан змінюється
Діаграма UML зі статті Вікі про державний зразок:
Якщо нам доведеться змінити поведінку об'єкта на основі його стану, ми можемо мати змінну стану в Об'єкті і використовувати блок умов if-else для виконання різних дій на основі стану. Державний зразок використовується для забезпечення систематичного способу досягнення цього способу шляхом реалізації контексту та стану .
Докладнішу інформацію див. У цій статті журналу .
Основні відмінності від sourcemaking і journaldev статей:
Мовою мирян,
у структурі стратегії немає держав або всі вони мають однаковий стан. У кожного є різні способи виконання завдання, як і різні лікарі по-різному ставляться до одного і того ж хвороби одного і того ж хворого з одним станом.
У Шаблоні стану суб'єктивно є такі стани, як поточний стан пацієнта (скажімо, висока температура або низька температура), на основі якого буде прийнято наступний курс дії (рецепт ліків). І один стан може призвести до іншого стану, тому стан є до державної залежності (склад технічно).
Якщо ми технічно спробуємо це зрозуміти, грунтуючись на порівнянні кодів обох, ми можемо втратити суб'єктивність ситуації, оскільки обидва виглядають дуже схоже.
Обидва шаблони делегуються до базового класу, який має декілька похідних, але лише у шарі стану ці похідні класи містять посилання на контекстний клас.
Іншим способом дивитися на це є те, що шаблон Стратегії - це більш простий варіант моделі держави; під-шаблон, якщо вам подобається. Це дійсно залежить, хочете ви, щоб похідні стани містили посилання на контекст чи ні (тобто: чи хочете ви, щоб вони викликали методи в контексті).
Для отримання додаткової інформації: Роберт С. Мартін (& Міка Мартін) відповідають на це у своїй книзі "Спритні принципи, закономірності та практики в C #". ( http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258 )
Це досить давнє запитання, але все ж я також шукав однакові відповіді, і це те, що я виявив.
Для моделі "Шаблон" давайте розглянемо приклад кнопки "Відтворення медіа-плеєра". Коли ми граємо, вона починає грати і дає зрозуміти контексту, що вона грає. Кожен раз, коли клієнт хоче виконати операцію гри, він перевіряє поточний стан гравця. Тепер клієнт знає, що стан об'єкта відтворюється через контекстний об'єкт, тому він викликає метод паузи стану об'єктів, що діяє. Частина клієнта, що усвідомлює стан і про те, в якому стані йому потрібно зробити дії, може бути автоматизована.
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
Обидва реалізують принцип відкритого закриття, тому розробник має можливість додавати нові стани до структури стану та нового алгоритму.
Але відмінність полягає в тому, що вони використовуються, а це - зразок стану, який використовується для виконання різної логіки на основі стану об'єкта. А у випадку стратегії інша логіка.
Держава має невеликі залежності в класах, похідних від держави: як одна держава знає про інші держави, що йдуть після неї. Наприклад, літо настає після зими для будь-якого сезону, або стан доставки після стану депозиту для покупок.
З іншого боку, Стратегія не має подібних залежностей. Тут будь-який стан може бути ініціалізований на основі типу програми / продукту.
Різниця обговорюється в http://c2.com/cgi/wiki?StrategyPattern . Я використовував схему стратегії для дозволу вибору різних алгоритмів у загальних рамках для аналізу даних. Завдяки цьому ви можете додавати алгоритми, не змінюючи загальну структуру та її логіку.
Типовим прикладом є те, що у вас Емі є рамка для оптимізації функції. Рамка встановлює дані та параметри. Шаблон стратегії дозволяє вибирати такі алгоритми, як найсильніші спуски, спряжені градієнти, BFGS тощо, не змінюючи рамки.
І стратегія, і держава мають однакову структуру. Якщо ви подивитеся на діаграму класів UML для обох моделей, вони виглядають абсолютно однаково, але їх наміри абсолютно різні. Шаблон дизайну стану використовується для визначення та управління станом об'єкта, тоді як шаблон стратегії використовується для визначення набору взаємозамінних алгоритмів і дозволяє клієнту вибрати один з них. Таким чином, стратегія - це модель, керована клієнтом, тоді як Object може сам керувати там станом.
Коли у вас є проект, який можна розділити на 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. Зразок стану дозволяє переходити з одного стану в інший та виконувати різні комбінації алгоритмів.
"Стратегія" - це лише алгоритм, який ви можете змінювати за різних потреб, і він обробляє щось для вас. Вих. ви можете вибрати, як стискати файл. zip або rar ... методом.
Але "Держава" МОЖЕ змінити всю вашу поведінку об'єкта, коли вона змінюється. Навіть вона може змінити інші поля ... ось чому вона має посилання на свого власника. Ви повинні помітити, що зміна об'єктного поля може взагалі змінити поведінку об'єкта. Вих. коли ви змінюєте State0 на State1 в obj, ви змінюєте ціле число на 10 .. тому, коли ми викликаємо obj.f0 (), який робить деякий обчислення і використовує це ціле число, це впливає на результат.