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

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

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

Шрифт:

-
+

Інтервал:

-
+

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

Добавити
1 ... 36 37 38 ... 58
Перейти на сторінку:
дзві­нок черго­во­му інже­не­ро­ві, який зне­ма­гає від нудьги у своїй комі­рчи­ні. От він вже точно знає, як вам допо­мо­гти! Інже­нер роз­по­від­ає вам, де зава­нта­жи­ти драйве­ри та як нала­шту­ва­ти їх під Ubuntu. Запит вирі­ше­но. Ви кла­де­те слухавку. Стру­кту­ра

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

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

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

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

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

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

Псе­вдо­код

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

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

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

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

При­клад викли­ку конте­кс­тної допо­мо­ги у ланцю­жку об’єктів UI.

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

// Інтерфейс обробників.
interface ComponentWithContextualHelp is
  method showHelp()


// Базовий клас простих компонентів.
abstract class Component implements ComponentWithContextualHelp is
  field tooltipText: string

  // Контейнер, що містить компонент, служить в якості
  // наступної ланки ланцюга.
  protected field container: Container

  // Базова поведінка компонента заключається в тому, щоб
  // показати вспливаючу підказку, якщо для неї задано текст.
  // А якщо ні — перенаправити запит своєму контейнеру, якщо
  // той існує.
  method showHelp() is
    if (tooltipText != null)
      // Показати підказку.
    else
      container.showHelp()


// Контейнери можуть містити як прості компоненти, так й інші
// контейнери. Тут формуються зв'язки ланцюжка. Клас успадкує
// метод showHelp від свого батька.
abstract class Container extends Component is
  protected field children: array of Component

  method add(child) is
    children.add(child)
    child.container = this


// Більшість конкретних компонентів влаштує базова поведінка
// допомоги із вспливаючою підказкою, що вони успадкують від
// класу Component.
class Button extends Component is
  // ...

// Але складні компоненти можуть перевизначати метод показу
// допомоги по-своєму. Але і в цьому випадку вони завжди можуть
// повернутися до базової реалізації, викликавши метод батька.
class Panel extends Container is
  field modalHelpText: string

  method showHelp() is
    if (modalHelpText != null)
      // Показати модальне вікно з допомогою.
    else
      super.showHelp()

// ...те саме, що й вище...
class Dialog extends Container is
  field wikiPageURL: string

  method showHelp() is
    if (wikiPageURL != null)
      // Відкрити сторінку Wiki в браузері.
    else
      super.showHelp()


// Клієнтський код.
class Application is
  // Кожна програма конфігурує ланцюжок по-своєму.
  method createUI() is
    dialog = new Dialog("Budget Reports")
    dialog.wikiPageURL = "http://..."
    panel = new Panel(0, 0, 400, 800)
    panel.modalHelpText = "This panel does..."
    ok = new Button(250, 760, 50, 20, "OK")
    ok.tooltipText = "This is an OK button that..."
    cancel = new Button(320, 760, 50, 20, "Cancel")
    // ...
    panel.add(ok)
    panel.add(cancel)
    dialog.add(panel)

  // Уявіть, що тут відбудеться.
  method onF1KeyPress() is
    component = this.getComponentAtMouseCoords()
    component.showHelp() Засто­су­ва­ння

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

За допо­мо­гою Ланцю­жка обов’язків ви може­те зв’язати поте­нці­йних обро­бни­ків в один ланцюг і по отри­ма­нню запи­та по черзі

1 ... 36 37 38 ... 58
Перейти на сторінку:

 Увага!

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

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