Публичный аккаунт WeChat:Мандариновая сосна Java Technology Nest
Статья впервые опубликованаНаггетсПлатформа, последующие действия, синхронное обновление общедоступной учетной записи, подписка и ответ"Добавить группу"может присоединитьсяОбмен интернет-технологиями и внутренняя push-группа, Обсудите вопросы интервью с группой крупных фабричных боссов. Отвечать"666"Интернет первой линии можно получить со всеми информационными пакетами (включая программное обеспечение для разработки, спецификации для разработки, классический электронный pdf и несколько отличных учебных курсов).
предисловие
В последнее время многие одноклассники хотят, чтобы я разобрался вШаблоны проектированияКонтент сегодня будет ядром шаблонов проектирования, чтобы освоить шаблоны проектирования, которые они используют.Фундаментальныйа такжесцены, которые будут использоватьсяКратко опишите его. Может быть, фундамент недостаточно прочный, чтобы знать, что он не настолько совершенен, но это не влияет на ваш код.
Лично я считаю, что шаблоны проектирования — это простоМетодология,теорияДля справки, чтобы вы могли поддерживать бизнес лучше и удобнее, не нужно тратить слишком много сил на написание различных материалов.demo
Иначе, поверьте, вы не поверите или нет, когда будете использовать его в проекте.
хочу узнать больше оКрасиво, эффектно, лаконичноСпособ написания кода, вы можете обратить внимание на мою домашнюю страницуСтолбец оптимизации дизайна кода
7 принципов шаблонов проектирования
единственная ответственность: Каждый класс отвечает только за одну ответственность (или за каждый метод)
Изоляция интерфейса: Зависимость класса от другого класса должна быть построена на наименьшем интерфейсе. Инверсия зависимостей: высокоуровневые модули не должны зависеть от низкоуровневых модулей, оба должны зависеть от интерфейсов, а не от деталей Детали зависят от абстракции, программирования для интерфейсов
замена ребра: подкласс должен иметь возможность заменить родительский класс, и подкласс должен стараться не переопределять метод родительского класса. Принцип открытого-закрытого: его можно изменить только для провайдера, но не для пользователя (т.е. совместимость кода), попробуйте использовать расширения для увеличения функций вместо изменения исходных классов.
Закон Деметры: Объект должен сохранять наименьшие знания о других объектах (принцип наименьших знаний)
Принцип синтетического повторного использования: Один класс использует код (методы) другого класса, попробуйте использовать синтез вместо наследования
Один, создай
1.1 Одноэлементный шаблон
принцип: гарантирует наличие только одного экземпляра класса и обеспечивает глобальную точку доступа к этому экземпляру.
голодный китаец: статическая постоянная статический блок кода
ленивый
Метод прямой оценки (потокобезопасный) плюс синхронизированный (потокобезопасный, низкая эффективность)
Синхронизировать после суждения (неправильный способ написания)
Двойное суждение (если-синхронно-если) (рекомендуется писать)
Анонимный статический внутренний класс (простой, рекомендуется)
Перечисление (просто, но методы объекта написаны в перечислении, немного неудобно)
Пример:
java.lang.Runtime#getRuntime()
,java.awt.Desktop#getDesktop()
1.2 Режим прототипа
принцип: используйте экземпляр прототипа, чтобы указать тип создаваемого объекта, и создайте новый объект, скопировав этот прототип.
Пример:Java
изObject
объектclone
метод,java.util.Arrays.ArrayList#toArray()
мелкая копия: копировать только значения для полей базового типа и строкового типа
глубокая копия: также копировать ссылочные типы (такие как массивы, объекты)
Реализация глубокого копирования:
1. Переписатьclone
, обрабатывать каждый ссылочный объект один за другим (вызывающий объект clone
), хлопотно, а если связь между объектами сложная, то один из них не реализует глубокую копию, что может привести к ошибкам
2. Используйте сериализацию и десериализацию, напримерJson
, илиJava
Встроенный метод сериализации (двоичный)
1.3 Режим Создателя (Режим Генератора)
принцип :
Инкапсулирует построение объекта и позволяет выполнять пошаговое построение.
Если генерация объекта слишком сложна (слишком много полей и присваивания имеют зависимости, которые нужно вызывать последовательно), процесс присваивания можно инкапсулировать вbuild()
, и положить вBuilder
В классе Этот класс предоставляет метод присваивания каждого поля и сохраняет его до вызоваbuild()
, этот метод возвращает экземпляр объекта.
В этом режиме вызывающему абоненту не нужно обращать внимание на процесс сборки, он просто устанавливает нужное значение, а затем вызываетbuild()
Экземпляр объекта можно получить, а если поле добавляется или модифицируется, меняется процесс построения, вызывающая сторона его не воспринимает, и нет необходимости модифицировать код, он соответствует принципу открытости-закрытости.
Пример:
StringBuilder
, некоторые в рамкеConfigurationBuilder
, для конфигурации сборки.
1.4 Простой заводской шаблон
принцип: Не раскрывайте клиентам внутренние детали при создании объекта и предоставьте общий интерфейс для создания объектов. Этот режим позволяет избежать повторяющегося кода определения того, какой подкласс создать, когда несколько вызывающих объектов создают объект, и если существует более одного подкласса, вызывающему объекту не нужно изменять код.
Пример:
Spring ApplicationContext
изgetBean
метод.
1.5 Шаблон фабричного метода
принцип: Определяет интерфейс для создания объектов, но решение о том, какой класс создавать, зависит от подклассов. Фабричные методы откладывают создание экземпляров до подклассов. Этот шаблон решает проблему, связанную с необходимостью изменения класса фабрики каждый раз, когда к простой фабрике добавляется подкласс. С этим режимом есть проблема: если вы добавляете подкласс, вам нужно одновременно добавить фабрику подклассов, а сложность системы выше.
Пример:
Calendar
,NumberFormat
1.6 Шаблон абстрактной фабрики
принцип: Предоставляет интерфейс для создания связанных семейств объектов. Как и выше, фабрика подклассов решает, какие объекты создавать. Этот шаблон является обновленной версией фабричного метода, за исключением того, что он создает несколько типов объектов одновременно (фабричные классы имеют несколько методов).
Этот режим управляет созданием и управлением новой коллекцией семейства объектов в классе фабрики. Эти семейства объектов обычно связаны друг с другом, и эти ассоциации могут обрабатываться во время создания. А для двух фабрик подклассов они могут вообще переключаться плавно, внося изменения в код крайне удобно (т.е. переход на подкласс фабрики).
Этот режим очень сложен при добавлении члена семейства объектов (то есть, все классы фабрики должны добавить метод), но относительно прост при добавлении нового класса семейства объектов (то есть добавлении фабрики подкласса).
Во-вторых, структура
2.1 Режим адаптера
принцип: Конвертировать один интерфейс на другой интерфейс, требуемый пользователем. Определите класс, реализуйте интерфейс, необходимый пользователем, составляют объект интерфейса, который необходимо преобразовать, и вызывать метод агрегированного объекта в переопределенном методе (метод, требуемый пользователем), если требуется возвращаемое значение, И тип возвращаемого значения несовместим, то он также должен быть обработан в способе, а затем возвращен. Этот процесс называется адаптацией. Этот класс называется классом адаптера. Используйте этот режим, чтобы быть совместимым с некоторыми старыми интерфейсами.
Пример:
java.util.Arrays#asList()
адаптировать массив кList
,Spring MVC
изHandlerAdapter
2.2 Шаблон декоратора
принцип :
Динамически добавляйте в класс одну или несколько функций (методов). Вызовите класс, который необходимо добавить, как A
, определить классB
,выполнитьA
Верхний интерфейс и агрегатA
объект экземпляра,B
В интерфейсе, реализованном классом, методы агрегированного объекта напрямую вызываются для других не связанных с ним методов. Для интересующего метода его можно добавить до и после вызова (например, если метод возвращает число, его можно умножить на 2 на исходное возвращаемое значение). другие методы, эти методы являются дополнительными функциями.B
класс - это класс декоратора, A
это украшенный класс.
Преимущество этого режима в том, чтоДекорированный класс также можно использовать в качестве декорированного класса, а затем можно бесконечно декорировать другой слой декорирования.
Пример:
java IO
поток
2.3 Режим прокси
принцип :
Управляйте доступом к другим объектам (уровень методов), вводите некоторую пре- или постобработку в методы целевого объекта через прокси-объекты Аспектно-ориентированное программирование.
Типы :
статический прокси: определить прокси-класс для реализации интерфейса верхнего уровня целевого объекта и агрегирования целевого объекта, а также добавить предварительную и постобработку при переопределении метода.
Динамический прокси :
JDK 动态代理
: Целевой объект должен иметь интерфейс верхнего уровня (методы в естественном интерфейсе могут быть проксированы) для использования.java.lang.reflect.Proxy#getProxyClass
CGLIB动态代理
: Просто класс. Принцип реализации ASM
Платформа динамически генерирует байт-код подкласса целевого класса объектов, а затем создает прокси-объект посредством отражения.
Пример:
Spring AOP
2.4 Режим моста
принцип :
Отделите абстракцию от реализации, чтобы они могли меняться независимо. Смысл моста в том, что у моста есть 2 стороны моста, где бы он ни находился. Две стороны моста можно изменить, но мост всегда один и тот же. Здесь мост представляет собой операцию (например, запуск программного обеспечения на мобильный телефон), а две стороны представляют собой два измерения операции (например, мобильный телефон и программное обеспечение). запущенного программного обеспечения и людей на мобильных телефонах, которые можно соединить, чтобы сформировать трехмерный вложенный мост).
Пример:
JDBC
Получение соединения, получение соединения — это одно измерение, база данных — это одно измерение, и существует несколько баз данных, так что это режим моста, в котором одно измерение базы данных изменяется, а другое измерение остается неизменным.
2.5 Режим наилегчайшего веса
принцип :
Используйте общий подход для поддержки большого количества детализированных объектов, которые совместно используют часть своего внутреннего состояния. Такие, как общие пулы потоков, постоянные пулы и т. д., ускоряют получение объектов.
Пример: java.lang.Integer#valueOf() java.lang.Boolean#valueOf()
2.6 Комбинированный режим
принцип :
Группировка объектов в древовидную структуру для представления иерархии «целое/часть» позволяет пользователям одинаково работать с отдельными объектами и сгруппированными объектами. Как правило, необходимо иметь определенную степень сходства между частью и целым, прежде чем ее можно будет абстрагировать.Часть/целое абстрагируется, и получается общедоступный абстрактный класс или интерфейс, а затем класс реализации обрабатывается по-разному в соответствии с к конкретной роли.
Пример:
java.util.Map#putAll(Map)
,java.util.List#addAll(Collection)
java.util.Set#addAll(Collection)
2.7 Внешний вид
принцип :
Предоставляет унифицированный интерфейс для доступа к группе интерфейсов в подсистеме, упрощая использование подсистемы.
3. Поведенческий
3.1 Схема цепочки ответственности (цепочка ответственности)
принцип: Дайте нескольким объектам возможность обработать запрос, соедините эти объекты в цепочку и отправляйте запрос по цепочке до тех пор, пока его не обработает один объект, избегая, таким образом, связи между отправителем и получателем запроса.
Пример:
javax.servlet.Filter#doFilter()
,netty 的 Handler Chain
3.2 Шаблон наблюдателя
принцип:
Определите зависимости между объектами "один ко многим". При изменении состояния объекта все его зависимости будут уведомлены, а состояние будет обновлено автоматически. тема(Subject
) — наблюдаемый объект, а все его зависимые (Observer
) называется наблюдателем.
Пример:
swing
прослушиватели событий (события кнопок, события мыши),JS
прослушиватель событий
3.3 Режим состояния
принцип:
Позволяет объекту изменять свое поведение при изменении его внутреннего состояния, и объект, по-видимому, изменяет класс, к которому он принадлежит. Режим состояния в основном используется для решения проблемы перехода состояния.Когда состояние передается, тоContext
Объект меняет свое поведение.
3.4 Режим стратегии
принцип:
Определите семейство алгоритмов, инкапсулируйте каждый алгоритм и сделайте их взаимозаменяемыми. Шаблон стратегии позволяет алгоритму быть независимым от клиентов, которые его используют.
Шаблон стратегии в основном используется для инкапсуляции набора семейств алгоритмов, которые можно заменять друг другом и динамически заменять по мере необходимости. Context
используемый алгоритм.
Пример:
java.util.Comparator#compare()
,javax.servlet.http.HttpServlet
3.5 Шаблон метода шаблона
принцип: Определите структуру алгоритма и отложите выполнение некоторых шагов до подклассов. С помощью шаблонных методов подклассы могут переопределять определенные шаги алгоритма без изменения структуры алгоритма.
Пример:
java.util.Collections#sort()
3.6 Командный режим
принцип: Разделите каждую операцию объекта (приемника команд) на каждый класс команд, а затем используйте класс управления командами для управления этими командами. Команду можно поставить в очередь для упорядоченного выполнения, и журнал операций команды может быть записан единообразно, а также может поддерживать операцию отмены (каждая команда может реализовать соответствующую отмену)
Преимущество этого режима в том, что если команда абстрагируется на несколько стандартных команд (таких как включение, выключение), а затем управляется работа нескольких приемников команд (таких как свет, телевизоры, кондиционеры), новые приемники команд может быть изменен Простой, то есть хорошая масштабируемость, также известная как универсальный пульт дистанционного управления.
3.7 Режим посредничества
принцип: Централизуйте сложные методы связи и управления между связанными объектами. Уменьшите связь между подсистемами. Подобно центру отправки и получения сообщений, он отвечает за передачу сообщений системы слов, чтобы можно было осуществлять определенные взаимодействия между подсистемами.
Пример: потоки и задачи диспетчера пула потоков для выполнения.
3.8 Режим заметок
принцип: Получите внутреннее состояние объекта, не нарушая инкапсуляцию, чтобы при необходимости объект можно было восстановить в исходное состояние. Например, делается сохранение текущего состояния игры, а затем состояние можно прочитать и перезапустить после смерти в последующих играх.
3.9 Шаблон посетителя
принцип:
Добавьте новые возможности в структуру объекта (например, составную структуру). Использование шаблона посетителя позволяет добиться перегруженной динамической привязки (т.е. псевдодвойной отправки), эффект используется в перегруженном методе. instanceof
Это то же самое, но с шаблоном посетителя, это более масштабируемо.
3.10 Шаблон итератора
принцип: Предоставляет способ последовательного доступа к элементам агрегатного объекта без раскрытия внутреннего представления агрегатного объекта.
Пример:
java.util.Iterator
3.11 Режим переводчика
принцип: Создает интерпретатор для языка, обычно определяемый грамматикой и синтаксическим анализом языка.
Пример:
EL 表达式
,Freemaker模板
3.12 Шаблон пустого объекта
принцип:
Вместо этого используйте пустой объект, который ничего не делаетNULL
, избегайте оценки нулевого объекта, избегайте исключения нулевого указателя.
Если вам нужна информация, вы можете ответить на ключевое слово [режим дизайна] в общедоступной учетной записи, чтобы получить полную информацию в формате PDF.
Ну, это ровно 12 часов вечера, если вы думаете, что это не плохо, бедаxdm
Сделайте репост и обратите внимание =. знак равно
наконец
- Все статьи оригинальные, оригинальность непростая, спасибоНаггетсплатформа, почувствуйте себя вознагражденным, помогитеСанлианХа, спасибо
- Публичный номер поиска WeChat:Мандариновая сосна Java Technology Nest, подружись, вступайГруппа по обмену интернет-технологиями
- Все коды, диаграммы последовательности и диаграммы архитектуры, используемые в статье, являются общими и доступны через официальный аккаунт.Добавить группу бесплатноспросить
- Если в статье есть ошибки, добро пожаловатьКомментарии, на которые следует обратить внимание, также приветствуюперепечатывать, пожалуйста, отметьтепроисхождениепросто хорошо