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

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

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

Шрифт:

-
+

Інтервал:

-
+

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

Добавити
1 ... 57 58
Перейти на сторінку:
про­по­нує стра­ху­ва­ння під­приє­мства на випа­док поже­жі чи повені. Стру­кту­ра

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

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

Еле­ме­нт опи­сує метод при­йо­му від­ві­ду­ва­ча. Цей метод пови­нен мати лише один пара­метр, ого­ло­ше­ний з типом зага­льно­го інте­рфе­йсу відвідувачів.

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

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

Псе­вдо­код

У цьому при­кла­ді Від­ві­ду­вач додає до існую­чої ієра­рхії кла­сів гео­ме­три­чних фігур можли­ві­сть екс­по­рту до XML.

При­клад орга­ні­за­ції екс­по­рту об’єктів XML через окре­мий клас-від­ві­ду­вач.

// Складна ієрархія елементів.
interface Shape is
  method move(x, y)
  method draw()
  method accept(v: Visitor)

// Метод прийняття відвідувача повинен бути реалізований у
// кожному елементі, а не тільки у базовому класі. Це допоможе
// програмі визначити, який метод відвідувача потрібно викликати
// у випадку, якщо ви не знаєте тип елемента.
class Dot implements Shape is
  // ...
  method accept(v: Visitor) is
    v.visitDot(this)

class Circle implements Shape is
  // ...
  method accept(v: Visitor) is
    v.visitCircle(this)

class Rectangle implements Shape is
  // ...
  method accept(v: Visitor) is
    v.visitRectangle(this)

class CompoundShape implements Shape is
  // ...
  method accept(v: Visitor) is
    v.visitCompoundShape(this)


// Інтерфейс відвідувачів повинен містити методи відвідування
// кожного елемента. Важливо, щоб ієрархія елементів змінювалася
// рідко, оскільки при додаванні нового елемента доведеться
// змінювати всіх існуючих відвідувачів.
interface Visitor is
  method visitDot(d: Dot)
  method visitCircle(c: Circle)
  method visitRectangle(r: Rectangle)
  method visitCompoundShape(cs: CompoundShape)

// Конкретний відвідувач реалізує одну операцію для всієї
// ієрархії елементів. Нова операція = новий відвідувач.
// Відвідувача вигідно застосовувати, коли нові елементи
// додаються дуже зрідка, а нові операції — часто.
class XMLExportVisitor implements Visitor is
  method visitDot(d: Dot) is
    // Експорт id та координат центру точки.

  method visitCircle(c: Circle) is
    // Експорт id, координат центру та радіусу кола.

  method visitRectangle(r: Rectangle) is
    // Експорт id, координат лівого-верхнього кута, висоти
    // та ширини прямокутника.

  method visitCompoundShape(cs: CompoundShape) is
    // Експорт id складової фігури, а також списку id
    // підфігур, з яких вона складається.


// Програма може застосовувати відвідувача до будь-якого набору
// об'єктів елементів, навіть не уточнюючи їхні типи. Потрібний
// метод відвідувача буде обрано завдяки проходу через метод
// accept.
class Application is
  field allShapes: array of Shapes

  method export() is
    exportVisitor = new XMLExportVisitor()

    foreach (shape in allShapes) do
      shape.accept(exportVisitor)

Вам не здає­ться, що виклик мето­ду accept — це зайва ланка? Якщо так, тоді ще раз реко­ме­ндую вам ознайо­ми­ти­ся з про­бле­мою ранньо­го та пізньо­го зв’язу­ва­ння в ста­тті Від­ві­ду­вач і Double Dispatch.

Засто­су­ва­ння

Якщо вам потрі­бно вико­на­ти якусь опе­ра­цію над усіма еле­ме­нта­ми скла­дної стру­кту­ри об’єктів, напри­клад, деревом.

Від­ві­ду­вач дозво­ляє засто­со­ву­ва­ти одну і ту саму опе­ра­цію до об’єктів різних класів.

Якщо над об’єкта­ми скла­дної стру­кту­ри об’єктів потрі­бно вико­ну­ва­ти деякі не пов’язані між собою опе­ра­ції, але ви не хоче­те «засмі­чу­ва­ти» класи таки­ми операціями.

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

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

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

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

Ство­рі­ть інте­рфе­йс від­ві­ду­ва­ча й ого­ло­сі­ть у ньому мето­ди «від­ві­ду­ва­ння» для кожно­го класу еле­ме­нта, який існує в програмі.

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

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

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

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

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

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

 Увага!

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

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