JavaRush /Java блог /Random UA /Різниця між патернами Стан та Стратегія в Java
0xFF
9 рівень
Донецк

Різниця між патернами Стан та Стратегія в Java

Стаття з групи Random UA
Для того, щоб правильно використовувати патерни Стан та Стратегія в ядрі Java додатків, важливо для Java програмістів чітко розуміти різницю між ними. Хоча обидва шаблони, Стан і Стратегія, мають схожу структуру, і обидва засновані на принципі відкритості/закритості, що представляють ”O” у SOLID принципах , вони зовсім різні за намірами . Різниця між патернами Стан та Стратегія в Java - 1Паттерн Стратегія Java використовується для інкапсуляції пов'язаних наборів алгоритмів для забезпечення гнучкості виконання для клієнта. Клієнт може вибрати будь-який алгоритм під час виконання без зміни контексту класу, який використовує об'єкт Strategy. Деякі популярні приклади патерну Стратегія– це написання коду, який використовує алгоритми, наприклад, шифрування, стискування або сортування. З іншого боку, патерн Стан дозволяє об'єкту поводитися по-різному у різному стані. Оскільки в реальному світі об'єкт часто має статки, і він веде себе по-різному в різних станах, наприклад, торговий автомат продає товари тільки якщо він в змозі, він не продає до тих пір, поки ви не покладете в нього монету hasCoin. Зараз ви можете ясно бачити різницю між патернами Стратегія та Стан, це різні наміри. Паттерн Стандопомагає об'єкту керувати станом, тоді як патерн Стратегія дозволяє вибрати клієнту іншу поведінку. Ще одна відмінність, яку не так легко побачити, це хтось керує зміною в поведінці. У випадку патерна Стратегія, це клієнт, який надає різні стратегії до контексту, у патерні Стан переходом управляє контекст чи стан об'єкта самостійно. Крім того, якщо ви керуєте змінами станів в об'єкті Стан самостійно, має бути посилання на контекст, наприклад, у торговому автоматі має бути можливість викликати метод setState()зміни поточного стану контексту. З іншого боку, об'єкт Стратегія ніколи не містить посилання на контекст, клієнт передає Стратегію свого вибору в контекст. Різниця між патернами Стан та Стратегія один зпопулярних питань про патерни Java на інтерв'ю , у цій статті про патерни Java ми докладніше розглянемо це. Ми будемо досліджувати деякі подібності та відмінності між патернами Стратегія та Стан у Java, які допоможуть вам покращити ваше розуміння цих патернів.

Подібності між патернами Стан та Стратегія

Якщо ви подивитеся на UML-діаграму патернів Стан та Стратегія, можна помітити, що обидва виглядають схожими один на одного. Об'єкт, який використовує Стан зміни своєї поведінки відомий як Context-об'єкт, аналогічно об'єкт, який використовує Стратегію, щоб змінити свою поведінку згадується як Context-об'єкт. Запам'ятайте, що клієнт взаємодіє з Contextоб'єктом. У разі патерну Стан контекст делегує методи виклику об'єкту Стан, який утримується у вигляді поточного об'єкта, а у разі патерну Стратегія контекст використовує об'єкт Стратегії як параметр або надається під час створення контексту об'єкта. UML діаграма патерну Стан у Java Різниця між патернами Стан та Стратегія в Java - 2Ця UML діаграма для патерну Стан зображує класичну проблему створення об'єктно-орієнтованого дизайну торгового апарату в Java. Ви можете бачити, що стан торгового апарату представлено з використанням інтерфейсу, який має реалізацію для представлення конкретного стану. Кожен стан також має посилання на контекст об'єкта, щоб зробити перехід в інший стан у результаті дій, викликаних у контексті. UML діаграма патерна Стратегія Java Різниця між патернами Стан та Стратегія в Java - 3 Ця UML діаграма для патерна Стратегія містить функціональні реалізації сортувань. Оскільки є багато алгоритмів сортування, цей шаблон проектування дозволяє клієнту вибрати алгоритм сортування об'єктів. Насправді Java Collection framework використовує цей патерн реалізуючи методCollections.sort(), який використовується для сортування об'єктів у Java. Єдина різниця в тому, що замість дозволу клієнту вибирати алгоритм сортування, він дозволяє йому вказати стратегію порівняння передаючи екземпляр інтерфейсу Comparator або Comparable в Java . Давайте подивимося на кілька подібностей між цими двома основними шаблонами проектування Java:
  1. Обидва патерни, Стан та Стратегія, роблять нескладним додавання нового стану та стратегії не торкаючись контексту об'єкта, який використовує їх.

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

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

  4. Паттерн Стан представляє різні поведінки у вигляді різних станів об'єкта, тоді як патерн Стратегія представляє різне поведінка як різних стратегій об'єкта.

  5. Обидва патерни, Стратегія та Стан, залежать від підкласів реалізації поведінки. Кожна конкретна стратегія розширює Абстрактну Стратегію, кожен стан є підкласом інтерфейсу або абстрактного класу , який використовується для припинення Стану.

Відмінності між патернами Стратегія та Стан у Java

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

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

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

  4. Реалізація Стратегії може бути передана як параметр об'єкту, який використовуватиме її, наприклад, Collection.sort() приймає Comparator , який є стратегією. З іншого боку, стан є частиною самого контексту об'єкта, і протягом тривалого часу контекст об'єкта переходить із одного стану до іншого.

  5. Хоча і Стратегія і Стан дотримуються принципу відкритості/закритості, Стратегія також слідує Принципу Єдиного Обов'язку, оскільки кожна Стратегія містить індивідуальний алгоритм, різні стратегії незалежні одна від одної. Зміна однієї стратегії не потребує зміни іншої стратегії.

  6. Ще одна теоретична відмінність між патернами Стратегія і Стан полягає в тому, що творець визначає частину об'єкта "Як", наприклад, "Як" об'єкт сортування сортує дані, з іншого боку патерн Стан визначає частини "що" і "коли" в об'єкті, наприклад , що може об'єкт коли він перебуває у певному стані.

  7. Порядок переходу стану добре визначений у патерні Стан такої вимоги немає до патерну Стратегія. Клієнт вільний у виборі будь-якої реалізації Стратегії з його вибір.

  8. Деякі із загальних прикладів патерну Стратегія – це інкапсуляція алгоритмів, наприклад алгоритми сортування, шифрування або алгоритм стиснення. Якщо ви бачите, що ваш код повинен використовувати різні види пов'язаних алгоритмів, слід подумати про використання патерну Стратегія. З іншого боку, розпізнати можливість використання патерну Стан досить легко, якщо вам потрібно керувати станом та переходами між станами без великої кількості вкладених умовних операторів патерн. Стан – потрібний патерн для використання.

  9. Остання, але одна з найважливіших відмінностей між патернами Стан та Стратегія полягає в тому, що зміна Стратегії виконується Клієнтом, а зміна Стану може бути виконана контекстом або станом об'єкта самостійно.

Це все про різницю між патернами Стан та Стратегія в Java . Як я сказав, обидва виглядають схоже у своїх класах та UML діаграмах, обидва забезпечують відкрито/закритий принцип та інкапсулюють поведінку. Використовуйте патерн Стратегія для інкапсулювання алгоритму або стратегії, який надається контексту під час виконання, можливо як параметр або складовий об'єкт і використовуйте патерн Стан для керування переходами між станами Java. Оригінал тут
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ