read-books.club » Інше » Занурення в патерни проектування, Олександр Швець 📚 - Українською

Читати книгу - "Занурення в патерни проектування, Олександр Швець"

10
0
В нашій бібліотеці можна безкоштовно в повній версії читати книжку українською мовою "Занурення в патерни проектування" автора Олександр Швець. Жанр книги: Інше. Наш веб сайт read-books.club дає можливість читати повні версії улюблених книг на Вашому гаджеті (IPhone, Android) або комп’ютері абсолютно безкоштовно, без реєстрації та СМС.

Шрифт:

-
+

Інтервал:

-
+

Додати в закладку:

Додати
1 ... 54 55 56 ... 58
Перейти на сторінку:
кожно­го етапу, буді­ве­льни­ки можу­ть роби­ти неве­ли­кі зміни на кожно­му з ета­пів, щоб зро­би­ти буди­нок трі­ше­чки не схо­жим на інші. Стру­кту­ра

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

Конкре­тний клас пере­ви­зна­чає деякі або всі кроки алго­ри­тму. Конкре­тні класи не пере­ви­зна­чаю­ть сам шабло­нний метод.

Псе­вдо­код

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

При­клад кла­сів шту­чно­го інте­ле­кту для про­стої гри.

Всі раси гри мати­му­ть при­бли­зно одна­ко­ві типи юні­тів та буді­ве­ль, тому стру­кту­ра шту­чно­го інте­ле­кту буде одна­ко­вою. Але різні раси можу­ть різним шля­хом реа­лі­зу­ва­ти ці кроки. Так, напри­клад, орки буду­ть агре­си­вні­ши­ми в атаці, люди більш акти­вни­ми в захи­сті, а дикі монстри вза­га­лі не буду­ть займа­ти­ся будівництвом.

class GameAI is
  // Шаблонний метод повинен бути заданий у базовому класі.
  // Він складається з викликів методів у певному порядку.
  // Здебільшого, ці методи є кроками якогось алгоритму.
  method turn() is
    collectResources()
    buildStructures()
    buildUnits()
    attack()

  // Деякі з цих методів можуть бути реалізовані безпосередньо
  // у базовому класі.
  method collectResources() is
    foreach (s in this.builtStructures) do
      s.collect()

  // А деякі можуть бути повністю абстрактними.
  abstract method buildStructures()
  abstract method buildUnits()

  // До речі, клас може мати більше одного шаблонного методу.
  method attack() is
    enemy = closestEnemy()
    if (enemy == null)
      sendScouts(map.center)
    else
      sendWarriors(enemy.position)

  abstract method sendScouts(position)
  abstract method sendWarriors(position)

// Підкласи можуть надавати свою реалізацію кроків алгоритму, не
// змінюючи сам шаблонний метод.
class OrcsAI extends GameAI is
  method buildStructures() is
    if (there are some resources) then
      // Будувати ферми, потім бараки, а потім цитадель.

  method buildUnits() is
    if (there are plenty of resources) then
      if (there are no scouts)
        // Побудувати раба, додати до групи розвідників.
      else
        // Побудувати піхотинця, додати до групи воїнів.

  // ...

  method sendScouts(position) is
    if (scouts.length > 0) then
      // Відправити розвідників на позицію.

  method sendWarriors(position) is
    if (warriors.length > 5) then
      // Відправити воїнів на позицію.

// Підкласи можуть не тільки реалізовувати абстрактні кроки, але
// й перевизначати кроки, вже реалізовані в базовому класі.
class MonstersAI extends GameAI is
  method collectResources() is
    // Нічого не робити.

  method buildStructures() is
    // Нічого не робити.

  method buildUnits() is
    // Нічого не робити. Засто­су­ва­ння

Якщо під­кла­си пови­нні роз­ши­рю­ва­ти базо­вий алго­ри­тм, не змі­нюю­чи його структури.

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

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

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

Це дозво­ли­ть при­бра­ти дублю­ва­ння коду в кількох кла­сах, які від­рі­зняю­ться дета­ля­ми, але мають схожу поведінку.

Кроки реа­лі­за­ції

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

Ство­рі­ть абстра­ктний базо­вий клас. Визна­чте в ньому шабло­нний метод. Цей метод пови­нен скла­да­ти­ся з викли­ків кро­ків алго­ри­тму. Є сенс у тому, щоб зро­би­ти шабло­нний метод фіна­льним, аби під­кла­си не могли пере­ви­зна­чи­ти його (якщо ваша мова про­гра­му­ва­ння це дозволяє).

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

Поду­майте про вве­де­ння хуків в алго­ри­тм. Найча­сті­ше хуки роз­та­шо­вую­ть між осно­вни­ми кро­ка­ми алго­ри­тму, а також до та після всіх кроків.

Ство­рі­ть конкре­тні класи, успа­дку­ва­вши їх від абстра­ктно­го класу. Реа­лі­зу­йте в них всі кроки та хуки, яких не вистачає.

Пере­ва­ги та недо­лі­ки Поле­гшує повто­рне вико­ри­ста­ння коду. Ви жорстко обме­же­ні ске­ле­том існую­чо­го алгоритму. Ви може­те пору­ши­ти принцип під­ста­но­вки Барба­ри Лісков, змі­нюю­чи базо­ву пове­ді­нку одно­го з кро­ків алго­ри­тму через підклас. У міру зро­ста­ння кілько­сті кро­ків шабло­нний метод стає зана­дто скла­дно підтримувати. Від­но­си­ни з інши­ми пате­рна­ми

Фабри­чний метод можна роз­гля­да­ти як окре­мий випа­док Шабло­нно­го мето­ду. Крім того,

1 ... 54 55 56 ... 58
Перейти на сторінку:

 Увага!

Сайт зберігає кукі вашого браузера. Ви зможете в будь-який момент зробити закладку та продовжити читання книги «Занурення в патерни проектування, Олександр Швець», після закриття браузера.

Коментарі та відгуки (0) до книги "Занурення в патерни проектування, Олександр Швець"