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

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

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

Шрифт:

-
+

Інтервал:

-
+

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

Добавити
1 ... 32 33 34 ... 58
Перейти на сторінку:
Також відомий як: Proxy

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

Про­бле­ма

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

Запи­ти до бази даних можу­ть бути дуже повільними.

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

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

Ріше­ння

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

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

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

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

Пла­ті­жною карткою можна роз­ра­хо­ву­ва­ти­ся так само, як і готівкою.

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

Стру­кту­ра

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

Сервіс місти­ть кори­сну бізнес-логі­ку.

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

Замі­сник може сам від­по­від­а­ти за ство­ре­ння й вида­ле­ння об’єкта сервісу.

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

Псе­вдо­код

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

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

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

// Інтерфейс віддаленого сервісу.
interface ThirdPartyYouTubeLib is
  method listVideos()
  method getVideoInfo(id)
  method downloadVideo(id)

// Конкретна реалізація сервісу. Методи цього класу запитують у
// YouTube різну інформацію. Швидкість запиту залежить не лише
// від якості інтернет-каналу користувача, але й від стану
// самого YouTube. Тому, чим більше буде викликів до сервісу,
// тим менш відзивною стане програма.
class ThirdPartyYouTubeClass implements ThirdPartyYouTubeLib is
  method listVideos() is
    // Отримати список відеороликів за допомогою API
    // YouTube.

  method getVideoInfo(id) is
    // Отримати детальну інформацію про якийсь відеоролик.

  method downloadVideo(id) is
    // Завантажити відео з YouTube.

// З іншого боку, можна кешувати запити до YouTube і не
// повторювати їх деякий час, доки кеш не застаріє. Але внести
// цей код безпосередньо в сервісний клас неможливо, бо він
// знаходиться у сторонній бібліотеці. Тому ми помістимо логіку
// кешування в окремий клас-обгортку. Він буде делегувати запити
// сервісному об'єкту, тільки якщо потрібно безпосередньо
// відіслати запит.
class CachedYouTubeClass implements ThirdPartyYouTubeLib is
  private field service: ThirdPartyYouTubeLib
  private field listCache, videoCache
  field needReset

  constructor CachedYouTubeClass(service: ThirdPartyYouTubeLib) is
    this.service = service

  method listVideos() is
    if (listCache == null || needReset)
      listCache = service.listVideos()
    return listCache

  method getVideoInfo(id) is
    if (videoCache == null || needReset)
      videoCache = service.getVideoInfo(id)
    return videoCache

  method downloadVideo(id) is
    if (!downloadExists(id) || needReset)
      service.downloadVideo(id)

// Клас GUI, який використовує сервісний об'єкт. Замість
// реального сервісу, ми підсунемо йому об'єкт-замісник. Клієнт
// нічого не помітить, так як замісник має той самий інтерфейс,
// що й сервіс.
class YouTubeManager is
  protected field service: ThirdPartyYouTubeLib

  constructor YouTubeManager(service: ThirdPartyYouTubeLib) is
    this.service = service

  method renderVideoPage(id
1 ... 32 33 34 ... 58
Перейти на сторінку:

 Увага!

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

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