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

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

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

Шрифт:

-
+

Інтервал:

-
+

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

Добавити
1 ... 27 28 29 ... 58
Перейти на сторінку:
/>

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

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

Про­гра­ма може зби­ра­ти скла­до­ві об’єкти з декораторів.

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

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

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

Одяг можна одя­га­ти кілько­ма шара­ми, отри­мую­чи комбі­но­ва­ний ефект.

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

Стру­кту­ра

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

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

Базо­вий деко­ра­тор збе­рі­гає поси­ла­ння на вкла­де­ний об’єкт-компо­не­нт. Це може бути як конкре­тний компо­не­нт, так і один з конкре­тних деко­ра­то­рів. Базо­вий деко­ра­тор деле­гує всі свої опе­ра­ції вкла­де­но­му об’єкту. Дода­тко­ва пове­ді­нка жити­ме в конкре­тних декораторах.

Конкре­тні деко­ра­то­ри — це різні варіа­ції деко­ра­то­рів, що містя­ть дода­тко­ву пове­ді­нку. Вона вико­нує­ться до або після викли­ку ана­ло­гі­чної пове­ді­нки заго­рну­то­го об’єкта.

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

Псе­вдо­код

У цьому при­кла­ді Деко­ра­тор захи­щає фіна­нсо­ві дані дода­тко­ви­ми рівня­ми без­пе­ки про­зо­ро для коду, який їх використовує.

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

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

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

// Загальний інтерфейс компонентів.
interface DataSource is
  method writeData(data)
  method readData():data

// Один з конкретних компонентів реалізує базову
// функціональність.
class FileDataSource implements DataSource is
  constructor FileDataSource(filename) { ... }

  method writeData(data) is
    // Записати дані до файлу.

  method readData():data is
    // Прочитати дані з файлу.

// Базовий клас усіх декораторів містить код обгортування.
class DataSourceDecorator implements DataSource is
  protected field wrappee: DataSource

  constructor DataSourceDecorator(source: DataSource) is
    wrappee = source

  method writeData(data) is
    wrappee.writeData(data)

  method readData():data is
    return wrappee.readData()

// Конкретні декоратори додають щось своє до базової поведінки
// обгорнутого компонента.
class EncryptionDecorator extends DataSourceDecorator is
  method writeData(data) is
    // 1. Зашифрувати подані дані.
    // 2. Передати зашифровані дані до методу writeData
    // обгорнутого об'єкта (wrappee).

  method readData():data is
    // 1. Отримати дані з методу readData обгорнутого
    // об'єкта (wrappee).
    // 2. Розшифрувати їх, якщо вони зашифровані.
    // 3. Повернути результат.

// Декорувати можна не тільки базові компоненти, але й вже
// обгорнуті об'єкти.
class CompressionDecorator extends DataSourceDecorator is
  method writeData(data) is
    // 1. Запакувати подані дані.
    // 2. Передати запаковані дані до методу writeData
    // обгорнутого об'єкта (wrappee).

  method readData():data is
    // 1. Отримати дані з методу readData обгорнутого
    // об'єкта (wrappee).
    // 2. Розпакувати їх, якщо вони запаковані.
    // 3. Повернути результат.


// Варіант 1. Простий приклад збирання та використання
// декораторів.
class Application is
  method dumbUsageExample() is
    source = new FileDataSource("somefile.dat")
    source.writeData(salaryRecords)
    // До файлу було занесено чисті дані.

    source = new CompressionDecorator(source)
    source.writeData(salaryRecords)
    // До файлу було занесено стислі дані.

    source = new EncryptionDecorator(source)
    // Зараз у source знаходиться зв'язка з трьох об'єктів:
    // Encryption > Compression > FileDataSource

    source.writeData(salaryRecords)
    // До файлу було занесено стислі та зашифровані дані.


// Варіант 2. Клієнтський код, який використовує зовнішнє
// джерело даних. Клас SalaryManager нічого не знає про те, як
// саме буде зчитано та записано дані. Він отримує вже готове
// джерело даних.
class SalaryManager is
  field source: DataSource

  constructor SalaryManager(source: DataSource) { ... }

  method load() is
    return source.readData()

  method save() is
    source.writeData(salaryRecords)
  // ...Інші корисні методи...


// Програма може різним шляхом збирати об'єкти, які декоруються
// залежно від умов використання.
class ApplicationConfigurator is
  method configurationExample() is
    source = new FileDataSource("salary.dat")
    if (enabledEncryption)
      source = new EncryptionDecorator(source)
    if (enabledCompression)
      source = new CompressionDecorator(source)

    logger = new SalaryManager
1 ... 27 28 29 ... 58
Перейти на сторінку:

 Увага!

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

Подібні книжки до книжки «Занурення в патерни проектування, Олександр Швець» жанру - 💛 Інше:


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