Please enable JavaScript.
Coggle requires JavaScript to display documents.
Паттерны проектирования - Coggle Diagram
Паттерны проектирования
Структурные
Мост
Позволяет отделить реализацию от интерфейса (они даже не обязаны реализовывать общий интерфейс + возможность выбора реализации динамически. По сути выходит, что более модный Адаптер над сущностями, которые ты проектируешь сам
Декоратор(Wrapper)
Добавление новой функциональности без применения наследования. Позволяет добавлять новую функциональность динамически. Позволяет не усложнять иерархию классов в случае необходимости добавить новую функциональность и не перегружать наследников кучей параметров, часть из которых вообще может не использоваться.
Немного похож на Стратегию, но в отличие от неё декорируемый объект ничего не знает о декораторе
-
Адаптер
Очень похож на мост, только для уже существующих систем. В идеале при первоначальном проектировании нужно использовать Мост вместо Адаптера
Позволяет адаптировать внешний объект (который мы не можем изменять) с одним интерфейсам к нужному нам интерфейсу, т.е. преобразует сторонний интейфес к нужному нам интерфейсу, делая интерфейсы совместимыми
заместитель(Proxy)
-
реализация очень похожа на декоратор, но принципиально отличается назначение
декоратор добавляет новую функциональность, в то время как заместитель лишь вводит новый уровень абстракции для большего контроля над текущим объектом
позволяет загружать "тяжелые" объекты по требованию, лишь тогда, когда это действительно необходимо
как пример - прокси объекты в Hibernate при их ленивой загрузке, когда поля подгружаются лишь тогда, когда они действительно нужны, а до этого замещаются proxy-объектами
не изменяет интерфейс оригинального объекта, но может быть подмножеством исходного интерфейса (например в случаях ограничения по правам доступа)
Компоновщик (Composite)
компонует объекты в древовидные структуры, представляя иерархию как одно целое
-
Фасад
Объединяет множество мелких подсистем в виде единого унифицированного интерфейса более высокого уровня
-
-
Порождающие
Абстрактная фабрика
например абстракная фабрика, создающая элементы пользовательского интерфейса и две конкретные файбрики: первая создаёт Angular элементы, а вторая React
удобно применять для создания взаимосвязанных наборов по интерфейсам, у которых может различаться реализация. Т.е. набор компонентов один и тот же (кнопки, поля ввода, слайдеры), а вот для Ангуляра и для Реакта реализации будут полностью отличаться.
одиночка
существует в едниственном экземпляре и его легко получить из любой части программы без глобальных переменных
прототип
позволяет создавать объекты на основании объекта-прототипа, вызывая у него, например, метод clone
удобен в случаях, когда объекты прототипы меняются динамически и/или загружаются из внешних настроек/конфигураций
-
Паттерны поведения
Стратегия (Policy)
Похож на Декоратор, но в отличии от декоратора, объект-клиент знает о всех своих Стратегиях и может выбирать динамически какую использовать. Так же чем-то похож на Мост, позволяя динамически вызывать обработчик запроса с совершенно любым интерфейсом
Посетитель (Visitor)
-
-
-
минусы
Сложно добавлять новые типы основных объектов, так как придется обновляться все типы Visitor
По сути определяет Двойную диспатчеризацию, там, где ЯП не поддерживает это напрямую
-
Комманда
-
позволяет дополнительно определить операцию Undo(), что бы можно было откатить изначальное действие
Итератор
Позволяет обходить все элементы заданной структуры (коллекции) не раскрывая деталей реализации это структуры
различные итераторы позволяют задавать разные алгоритмы обхода. Например reverseIterator позволяет обходить список в обратном порядке
-
Наблюдатель (Observer, Pub-Sub)
Позволяет немедленно оповещать Subscriber
'ов об изменениях, которые происходят в Subject
'e.
-
-
примеры
RxJava (Subject, Subscriber), Reactor (Publisher, Subscriber)
-
Посредник (Mediator)
Позволяет "коллегам" общаться друг с другом через "Посредника/Директора", ничего не зная друг о друге
плюсы
уменьшается связаность "коллег" друг с другом, позволяя их переиспользовать
наследники "посредника" инкапсулируют логику конкретного поведения, позволяя обойтись без порождения множества подклассов "коллег"
-
пример
Диалоговое окно с несколькими элементами (кнопки, списки, строка ввода), которые друг о друге ничего не знают, но при этом внутри посредника реализована логика изменения значения ввода строки в зависимости от выбранного значения из списка
DispatcherServlet - связывается котроллеры с запросами и с view, которые друг о други ничего не знают
Cостояние
Позволяет динамически изменять поведение объекта в зависимости от внутреннего состояния таким образом, что со стороны кажется, что это совершенно разные объекты.
плюсы
-
позволяет изменять поведение в каждом конкретном состоянии не изменяя других состояний и без опасения их сломать.
-
Паттерн является по сути альтернативой наличию в коде многих if
/switch
условных переходов в зависимости от флага(ов) сосятояния
Хранитель(Memento)
Выносит за пределы объекта его состояние не нарушая при этом инкапсуляции таким образом, что становится возможным восстановление изначального состояния объекта
цепочка обязанностей
Отвязывает отправителя запроса от получателя, передавая запрос первому обработчику в цепочке, которые может обработать или не обработать запрос, передать его дальше по цепочке или прекратить обработку.
примеры
распространение действия пользовательского интерфейса (например щелчёк мыши), который может быть обработан одним из нижележащих компонентов пользовательского интерфейса.
-