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

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

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

Шрифт:

-
+

Інтервал:

-
+

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

Добавити
1 ... 48 49 50 ... 58
Перейти на сторінку:
/> // компонентів бізнес-логіку. Ми могли б зробити його прямим
// нащадком EventManager, але в реальному житті це не завжди є
// можливим (наприклад, якщо в класу вже є предок). Тому тут ми
// підключаємо механізм підписки за допомогою композиції.
class Editor is
  public field events: EventManager
  private field file: File

  constructor Editor() is
    events = new EventManager()

  // Методи бізнес-логіки, які сповіщають підписників про
  // зміни.
  method openFile(path) is
    this.file = new File(path)
    events.notify("open", file.name)

  method saveFile() is
    file.write()
    events.notify("save", file.name)
  // ...


// Загальний інтерфейс підписників. У багатьох мовах, що мають
// функціональні типи, можна обійтися без цього інтерфейсу та
// конкретних класів, замінивши об'єкти підписників функціями.
interface EventListener is
  method update(filename)

// Набір конкретних підписників. Кожен з них виконує якусь
// поведінку, реагуючи на сповіщення від видавця.
class LoggingListener implements EventListener is
  private field log: File
  private field message: string

  constructor LoggingListener(log_filename, message) is
    this.log = new File(log_filename)
    this.message = message

  method update(filename) is
    log.write(replace('%s',filename,message))

class EmailAlertsListener implements EventListener is
  private field email: string
  private field message: string

  constructor EmailAlertsListener(email, message) is
    this.email = email
    this.message = message

  method update(filename) is
    system.email(email, replace('%s',filename,message))


// Програма може сконфігурувати видавців та підписників, як
// завгодно, залежно від цілей та оточення.
class Application is
  method config() is
    editor = new Editor()

    logger = new LoggingListener(
      "/path/to/log.txt",
      "Someone has opened file: %s");
    editor.events.subscribe("open", logger)

    emailAlerts = new EmailAlertsListener(
      "[email protected]",
      "Someone has changed the file: %s")
    editor.events.subscribe("save", emailAlerts) Засто­су­ва­ння

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

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

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

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

Вида­вці веду­ть дина­мі­чні спи­ски. Усі спо­сте­рі­га­чі можу­ть під­пи­су­ва­ти­ся або від­пи­су­ва­ти­ся від отри­ма­ння спо­ві­ще­нь без­по­се­ре­дньо під час вико­на­ння програми.

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

Роз­би­йте вашу функціо­на­льні­сть на дві части­ни: неза­ле­жне ядро та опціо­на­льні зале­жні части­ни. Неза­ле­жне ядро стане вида­вцем. Зале­жні части­ни ста­ну­ть підписниками.

Ство­рі­ть інте­рфе­йс під­пи­сни­ків. Зазви­чай доста­тньо визна­чи­ти в ньому лише один метод сповіщення.

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

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

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

Ство­рі­ть класи конкре­тних вида­вців. Реа­лі­зу­йте їх таким чином, щоб після кожної зміні стану вони слали спо­ві­ще­ння всім своїм підписникам.

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

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

Кліє­нт пови­нен ство­рю­ва­ти нео­бхі­дну кількі­сть об’єктів під­пи­сни­ків та під­пи­су­ва­ти їх у видавців.

Пере­ва­ги та недо­лі­ки Вида­вці не зале­жа­ть від конкре­тних кла­сів під­пи­сни­ків і навпаки. Ви може­те під­пи­су­ва­ти і від­пи­су­ва­ти оде­ржу­ва­чів «на льоту». Реа­лі­зує принцип від­кри­то­сті/закри­то­сті. Під­пи­сни­ки спо­ві­щую­ться у випа­дко­вій послі­до­вно­сті. Від­но­си­ни з інши­ми пате­рна­ми

Ланцю­жок обов’язків, Кома­нда Посе­ре­дник та Спо­сте­рі­гач пока­зую­ть різні спосо­би робо­ти тих, хто надси­лає запи­ти, та тих, хто їх отримує:

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

Різни­ця між Посе­ре­дни­ком та Спо­сте­рі­га­чем не завжди оче­ви­дна. Найча­сті­ше вони висту­паю­ть як конку­ре­нти, але іноді можу­ть пра­цю­ва­ти разом.

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

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

 Увага!

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

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