Содержание
- 2. Образец проектирования Образец (шаблон) проектирования – повторно используемое решение типичной проблемы проектирования. Состоит из*: Имени (Абстрактной)
- 3. Классификация образцов Структурные – решают задачи, связанные с отношением между классами (или другими сущностями) Поведенческие –
- 4. Базовые структурные образцы Abstract Server Adapter Proxy
- 5. Abstract Server: пример задачи Проблема: выключатель нельзя использовать для утюга и других приборов.
- 6. Abstract Server: пример решения Решение: поставить выключатель в зависимость от абстракции (применить DIP)
- 7. Abstract Server: образец Задача: исключить зависимость класса-клиента от реализации класса-сервера Решение: использовать абстракцию (абстрактный класс или
- 8. Abstract Server: замечания Практически любой класс, предоставляющий функциональность наружу пакета рассматривается как сервер => использование такого
- 9. Adapter: пример задачи Проблема: использовать выключатель для прибора с несовместимой по форме (но совместимой по напряжению)
- 10. Adapter: пример решения Решение: использовать переходник из одной розетки в другую
- 11. Adapter: образец Задача: адаптировать класс для использования через интерфейс, который класс изначально не реализует Решение: использовать
- 12. Proxy: пример задачи Клиент оперирует большим количеством изображений, при этом только некоторые будут отображены. Проблема: большой
- 13. Proxy: пример решения Решение: вместо настоящего изображения, используется заместитель, который загружает изображение только в случае его
- 14. Proxy: образец Задача: обеспечить контроль доступа к объектам класса: авторизацию, загрузку, удаленное обращение и т.д. Решение:
- 15. Области применения Proxy Доступ к удаленному объекту Доступ к «тяжелому» объекту: отложенная загрузка, выгрузка из памяти
- 16. Жизненный цикл объекта object: SomeClass Объект создан Объект инициализирован Первое использование объекта Последнее использование объекта Объект
- 17. Проблемы контроля жизненного цикла объектов Контроль жизненного цикла – cross-cutting concern Проблемы: Вызов конструктора невозможно сделать
- 18. Порождающие образцы RAII Lazy Initialization Singleton Abstract Factory Prototype Builder Dependency Injection
- 19. Resource Acquisition Is Initialization (RAII) Пример задачи: необходимо обеспечить простую и эффективную с точки зрения блокирования
- 20. Resource Acquisition Is Initialization (RAII) object: SomeClass Объект создан Объект инициализирован Первое использование объекта Последнее использование
- 21. RAII: конструирование Конструирование (захват ресурсов) должно производиться атомарным вызовом (конструктора или порождающей функции).
- 22. RAII: уничтожение С++: для стековых объектов в момент выхода переменной из области видимости Языки с динамической
- 23. RAII: Java FileOutputStream out = null; try{ out = new FileOutputStream (outFile); //… } finally{ out.close();
- 24. RAII: анализ Преимущества: Повышает логическую безопасность системы: невозможно использовать неинициализированные объекты. Обеспечивает четкий контроль за использованием
- 25. Отложенная инициализация (Lazy Initialization) Пример задачи: необходимо реализовать класс изображений, загружаемых с файловой системы. Класс должен
- 26. Отложенная инициализация: образец object: SomeClass Объект создан Получены данные инициализации Фактическая инициализация, первое использование объекта Получение
- 27. Отложенная инициализация: анализ Преимущества: Оптимизирует вычисления, избавляясь от инициализации ненужных объектов. Оптимизирует доступ к ресурсам, захватывая
- 28. Лирическое отступление: отложенное исполнение Отложенные вычисления: вычисления происходят не в момент вызова, а, либо в момент
- 29. Понятие чистой функции Чистая функция (referential transparent) – функция, значение которой полностью определяется ее параметрами, и
- 30. Singleton Задача: обеспечить создание ровно одного экземпляра класса. Решение: public class Singleton(){ private static Singleton instance
- 31. Singleton: анализ Применение: глобально-доступный инструментарий, который не может быть представлен обычными функциями (например, использует дополнительные конфигурационные
- 32. Abstract Factory: пример задачи Клиент не должен зависеть от реализации виджетов. Клиент может использовать их через
- 33. Abstract Factory: пример решения
- 34. Задача: обеспечить «полиморфный» конструктор Решение: конструирование выполняется с помощью объекта дополнительного полиморфного класса Последствия: Фабрика имеет
- 35. Prototype Пример задачи: см. «Abstract Factory» Решение: объекты создаются как клоны объектов-прототипов
- 36. Prototype: анализ Преимущества: простой дизайн прототип обладает свойствами класса, его можно применять для создания динамических объектных
- 37. Builder: задача Необходимо сконструировать сложный объект (например HTML-документ), что невозможно сделать атомарным вызовом. При этом необходимо,
- 38. Builder: образец Решение: Клиент использует build*- методы для инициализации объекта. Далее, объект востребуется атомарно посредством getProduct
- 39. Builder (GOF-вариант) Задача: Сконструировать сложный объект, причем алгоритм конструирования не должен зависеть от того, какой конкретно
- 40. IoC и жизненный цикл объекта Garbage Collector: вместо явного уничтожения объект «забывается» и далее обрабатывается некоторой
- 41. Инициализация зависимостей без применения Dependency Injection public interface ITool{ …} public class Fork implements ITool{ …
- 42. Тривиальный Dependency Injection (DI) на основе конструктора //constructor-based DI class public class Person2{ ITool tool; public
- 43. Преимущества DI Агрегирующие классы (т.е. те, для которых работает DI) не обязаны зависеть от конкретных классов
- 44. Проблемы с тривиальным DI DI реализует «божественная» сущность, зависящая от всей системы (нарушение ORR, LoD) Явно
- 45. DI на основе контейнера Контейнер универсален и не зависит от конкретных классов реализации. Зависимость устанавливается внешними
- 46. DI: Spring framework example //container-based DI class public class Person3 implements IPerson{ @Inject ITool tool; }
- 47. Поведенческие образцы Iterator Observer Immutable Object Memento Template method Strategy Command Chain of responsibilities
- 48. Iterator Задача: имеется составной объект (список, дерево), необходимо обеспечить доступ к отдельным его частям и перемещение
- 49. Observer Задача: автоматически оповещать объектов-наблюдателей об изменении состояния наблюдаемого объекта. Решение:
- 50. Immutable Object Неизменяемый объект: объект, получающий состояние при конструировании и не меняющий его. Изменение состояния моделируется
- 51. Immutable Object: анализ Преимущества: является необходимым условием для кода без побочных эффектов; существенно упрощает синхронизацию потоков/процессов;
- 52. Memento Задача: обеспечить сохранение текущего состояния объекта и его последующее восстановления (для передачи объекта по сети,
- 53. Memento: анализ Преимущества: Обеспечивает сериализацию (маршалинг) объектов без привязки к конкретному формату/протоколу передачи. Недостатки: Затруднено применение
- 54. Template Method Задача: реализовать универсальный класс Thread Решение:
- 55. Template Method: образец
- 56. Template Method: анализ Преимущества: Позволяет реализовать универсальный абстрактный алгоритм, пропускающий некоторые детали своей реализации. Детали реализуются
- 57. Strategy Задача: см. Template Method Решение:
- 58. Strategy: образец
- 59. Strategy: анализ Преимущества: Позволяет реализовать универсальный абстрактный алгоритм, пропускающий некоторые детали своей реализации. Детали реализуются в
- 60. Задача: интерфейс командной строки все команды имеют вид command_name [args] набор команд должен быть расширяем добавление
- 61. Решение
- 62. GeneralProcessor class GeneralProcessor{ //… public void executeCommand(Command command){ boolean isProcessed = false; for (IProcessor p: procs){
- 63. Использованные шаблоны Strategy (2 раза) Chain of Responsibilities Command Facade
- 64. Command-Query Separation (CQS) CQS – принцип построения интерфейсов. Каждый метод является либо командой, либо запросом но
- 66. Скачать презентацию