Evgenii Legotckoi
Evgenii Legotckoi01 жовтня 2018 р. 04:34

Структурні шаблони проектування - Пристосуванець

Голи

  • Використання загального доступу для ефективного використання великої кількості об'єктів.
  • Стратегія GUI Motif із заміни великовагових віджетів легкими віджетами.

Проблеми

Проектування об'єктів до найнижчих рівнів «гранулярності» системи забезпечує оптимальну гнучкість, але може бути неприйнятно дорогим з погляду продуктивності та використання пам'яті.


Обговорення

Шаблон Flyweight описує, як обмінюватися об'єктами, щоб їх використання можна було реалізувати за тонкої деталізації без надмірних накладних витрат. Кожен об'єкт "Flyweight" ділиться на дві частини: залежну від стану (зовнішню) частину та незалежну від стану (внутрішню) частину. Внутрішній стан зберігається (спільно використовується) в об'єкті Flyweight. Зовнішній стан зберігається або обчислюється клієнтськими об'єктами та передається Flyweight під час його виконання.

Ілюстрацією цього підходу були віджети Motif, які були перероблені як легкі віджети. Тоді як віджети досить «розумні», щоб працювати самостійно; легкі віджети існують у залежному зв'язку з віджетами диспетчера макетів. Кожен менеджер компонування надає залежну від контексту обробку подій, управління об'єктами та сервіси ресурсів для своїх легкофесних віджетів, і кожен легковажний віджет несе відповідальність лише за незалежний від контексту стан та поведінку.

Структура

Flyweights зберігаються у репозиторії Factory. Клієнт стримує себе від створення Flyweights безпосередньо та запитує їх у Factory. Кожен літнійоб'єкт не може стояти сам по собі. Будь-які атрибути, які могли б унеможливити спільне використання, повинні надаватися клієнтом щоразу, коли робиться запит на Flyweight. Якщо контекст піддається «економії» (тобто Клієнт може легко обчислити або знайти необхідні атрибути), тоді шаблон Flyweight пропонує підходящий під контекст результат.

Класи Ant, Locust та Cockroach можуть бути «легкими», тому що їхній конкретний стан екземпляра був деінкапсульований або екстерналізований і повинен бути наданий клієнтом.

Приклад

Flyweight використовує загальний доступ для ефективного використання великої кількості об'єктів. Сучасні веб-браузери використовують цей метод для запобігання завантаженню однакових зображень двічі. Коли браузер завантажує веб-сторінку, він переглядає усі зображення на цій сторінці. Браузер завантажує все нові зображення з Інтернету та поміщає їх у внутрішній кеш. Для завантажених зображень створюється flyweight об'єкт, який має деякі унікальні дані, такі як позиція всередині сторінки.

Контрольний список

  1. Переконайтеся, що накладні витрати на об'єкт – це проблема, яка потребує уваги, і клієнт цього класу може виправити ситуацію.
  2. Розділіть стан цільового класу на: внутрішній стан та зовнішній стан.
  3. Видаліть зовнішній стан з атрибутів класу і додайте до нього список аргументів, що викликають, для порушених методів.
  4. Створіть фабрику, яка може кешувати та повторно використовувати існуючі екземпляри класів.
  5. Клієнт повинен використовувати Factory замість оператора new для запиту об'єктів.
  6. Клієнт повинен шукати або обчислювати стан, що не є внутрішньою частиною об'єкта, та надавати цей стан методам класу.

Емпіричні правила

  • У той час як Flyweight показує, як зробити багато маленьких об'єктів, Facade показує, як зробити один об'єкт, який представляє цілу підсистему.
  • Flyweight часто комбінується з Composite для реалізації загальних нод списку.
  • Символи терміналу в абстрактному синтаксичному дереві інтерпретатора можуть використовуватися як Flyweight.
  • Flyweight пояснює, коли та як об'єкти State можуть використовуватися спільно.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 22:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi01 листопада 2024 р. 00:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 18:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 17:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 21:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi25 червня 2024 р. 01:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах