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

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

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

Шрифт:

-
+

Інтервал:

-
+

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

Додати
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) до книги "Занурення в патерни проектування, Олександр Швець"