Книги Українською Мовою » 💛 Інше » Занурення в патерни проектування, Олександр Швець 📚 - Українською

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

В нашій бібліотеці можна безкоштовно в повній версії читати книгу онлайн українською мовою "Занурення в патерни проектування" автора Олександр Швець. Жанр книги: 💛 Інше. Наш веб сайт ReadUkrainianBooks.com дає можливість читати повні версії улюблених книг на Вашому гаджеті (IPhone, Android) або комп’ютері абсолютно безкоштовно, без реєстрації та СМС. Також маєте можливість завантажити книги на свій гаджет у форматі PDF, EPUB, FB2. Файли електронних книг - це цифрові файли, які призначені для перегляду на спеціальних пристроях, що відомі як читальні пристрої для електронних книг.

Шрифт:

-
+

Інтервал:

-
+

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

Добавити
1 ... 43 44 45 ... 58
Перейти на сторінку:
конте­кс­тах. Отже ви змо­же­те або вико­ри­сто­ву­ва­ти всі еле­ме­нти від­ра­зу, або не вико­ри­сто­ву­ва­ти жоден. Ріше­ння

Пате­рн Посе­ре­дник зму­шує об’єкти спі­лку­ва­ти­ся через окре­мий об’єкт-посе­ре­дник, який знає, кому потрі­бно пере­на­пра­ви­ти той або інший запит. Завдя­ки цьому компо­не­нти систе­ми зале­жа­ти­му­ть тільки від посе­ре­дни­ка, а не від деся­тків інших компонентів.

У нашо­му при­кла­ді посе­ре­дни­ком міг би стати діа­лог. Імо­ві­рно, клас діа­ло­гу вже знає, з яких еле­ме­нтів він скла­дає­ться. Тому жодних нових зв’язків дода­ва­ти до нього не доведеться.

Еле­ме­нти інте­рфе­йсу спі­лкую­ться через посередника.

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

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

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

Ана­ло­гія з життя

Піло­ти літа­ків спі­лкую­ться не без­по­се­ре­дньо, а через диспетчера.

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

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

Стру­кту­ра

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

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

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

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

Псе­вдо­код

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

При­клад стру­кту­ру­ва­ння кла­сів UI діалогів.

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

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

// Загальний інтерфейс посередників.
interface Mediator is
  method notify(sender: Component, event: string)


// Конкретний посередник. Усі зв'язки між конкретними
// компонентами переїхали до коду посередника. Він отримує
// повідомлення від своїх компонентів та знає, як на них
// реагувати.
class AuthenticationDialog implements Mediator is
  private field title: string
  private field loginOrRegisterChkBx: Checkbox
  private field loginUsername, loginPassword: Textbox
  private field registrationUsername, registrationPassword,
         registrationEmail: Textbox
  private field okBtn, cancelBtn: Button

  constructor AuthenticationDialog() is
    // Тут потрібно буде створити об'єкти усіх компонентів,
    // подавши поточний об'єкт-посередник до їхніх
    // конструкторів.

  // Коли щось трапляється з компонентом, він надсилає
  // посереднику повідомлення. Після отримання повідомлення
  // посередник може або зробити щось самостійно, або
  // перенаправити запит іншому компонентові.
  method notify(sender, event) is
    if (sender == loginOrRegisterChkBx and event == "check")
      if (loginOrRegisterChkBx.checked)
        title = "Log in"
        // 1. Показати компоненти форми входу.
        // 2. Приховати компоненти форми реєстрації.
      else
        title = "Register"
        // 1. Показати компоненти форми реєстрації.
        // 2. Приховати компоненти форми входу.

    if (sender == okBtn && event == "click")
      if (loginOrRegister.checked)
        // Намагатись знайти користувача з даними із
        // форми логіна.
        if (!found)
          // Показати помилку над формою логіна.
      else
        // 1. Створити аккаунт користувача з даними
        // форми реєстрації.
        // 2. Авторизувати цього користувача.
        // ...


// Класи компонентів спілкуються з посередниками через їх
// загальний інтерфейс. Завдяки цьому, одні й ті ж компоненти
// можна використовувати в різних посередниках.
class Component is
  field dialog: Mediator

  constructor Component(dialog) is
    this.dialog = dialog

  method click() is
    dialog.notify(this, "click")

  method keypress() is
    dialog.notify(this, "keypress")

// Конкретні компоненти жодним чином не пов'язані між собою. У
// них є тільки один канал спілкування — через надсилання
// повідомлень посереднику.
class Button extends Component is
  // ...
1 ... 43 44 45 ... 58
Перейти на сторінку:

 Увага!

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

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