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

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

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

Шрифт:

-
+

Інтервал:

-
+

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

Добавити
1 ... 46 47 48 ... 58
Перейти на сторінку:

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

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

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

// Клас творця повинен мати спеціальний метод, який зберігає
// стан об'єкта в новому об'єкті-знімку.
class Editor is
  private field text, curX, curY, selectionWidth

  method setText(text) is
    this.text = text

  method setCursor(x, y) is
    this.curX = x
    this.curY = y

  method setSelectionWidth(width) is
    this.selectionWidth = width

  method createSnapshot(): Snapshot is
    // Знімок — це незмінний об'єкт, тому творець передає до
    // нього свій стан через параметри конструктора.
    return new Snapshot(this, text, curX, curY, selectionWidth)

// Знімок зберігає минулий стан редактора.
class Snapshot is
  private field editor: Editor
  private field text, curX, curY, selectionWidth

  constructor Snapshot(editor, text, curX, curY, selectionWidth) is
    this.editor = editor
    this.text = text
    this.curX = x
    this.curY = y
    this.selectionWidth = selectionWidth

  // У потрібний момент власник знімку може відновити стан
  // редактора.
  method restore() is
    editor.setText(text)
    editor.setCursor(curX, curY)
    editor.setSelectionWidth(selectionWidth)

// Опікуном може виступати клас команд (див. патерн Команда). У
// цьому випадку команда зберігає знімок стану об'єкта-
// одержувача перед тим, як передати йому дію. А в разі
// скасування дії, команда поверне об'єкт до попереднього стану.
class Command is
  private field backup: Snapshot

  method makeBackup() is
    backup = editor.createSnapshot()

  method undo() is
    if (backup != null)
      backup.restore()
  // ... Засто­су­ва­ння

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

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

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

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

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

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

Ство­рі­ть клас знім­ка та опи­ші­ть в ньому ті ж самі поля, які є в ори­гі­на­льно­му класі-тво­рці.

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

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

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

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

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

Додайте до класу тво­рця метод від­нов­ле­ння зі знім­ка. Щодо прив’язки до типів, керу­йте­ся тією ж логі­кою, що і в пункті 4.

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

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

Пере­ва­ги та недо­лі­ки Не пору­шує інка­псу­ля­цію вихі­дно­го об’єкта. Спро­щує стру­кту­ру вихі­дно­го об’єкта. Йому не потрі­бно збе­рі­га­ти істо­рію версій свого стану. Вима­гає бага­то пам’яті, якщо кліє­нти дуже часто ство­рюю­ть знімки. Може спри­чи­ни­ти дода­тко­ві витра­ти пам’яті, якщо об’єкти, що збе­рі­гаю­ть істо­рію, не зві­льняю­ть ресу­рси, зайня­ті заста­рі­ли­ми знімками. В деяких мовах (напри­клад, PHP, Python, JavaScript) скла­дно гара­нту­ва­ти, щоб лише вихі­дний об’єкт мав доступ до стану знімка. Від­но­си­ни з інши­ми пате­рна­ми

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

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

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

 Увага!

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

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