Перейти к основному содержимому

Поиск по CooLWJ

选择搜索范围,输入关键词后按回车。

Язык

Какие паттерны проектирования используются в JDK?

I,Структурные паттерны

1,паттерн «Адаптер»

Используется для преобразования одного интерфейса в другой

java.util.Arrays#asList()

javax.swing.JTable(TableModel)

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

2,паттерн «Мост»

Этот паттерн отделяет абстракцию от реализации абстрактных операций, позволяя абстракции и реализации изменяться независимо

AWT (Предоставляет уровень абстракции, который использует оконные возможности операционной системы.)

JDBC

3,паттерн «Компоновщик»

Благодаря этому клиент воспринимает отдельный объект и совокупность объектов одинаково. Иными словами, метод некоторого типа также принимает в качестве параметра объект собственного типа

javax.swing.JComponent#add(Component)

java.awt.Container#add(Component)

java.util.Map#putAll(Map)

java.util.List#addAll(Collection)

java.util.Set#addAll(Collection)

4,паттерн «Декоратор»

Динамически добавлять объекту дополнительные возможности — это также альтернатива созданию подклассов. Как видно, при создании экземпляра типа ему одновременно передаётся объект того же типа. В JDK это встречается повсюду, поэтому приведённый ниже список — лишь небольшая часть примеров

java.io.BufferedInputStream(InputStream)

java.io.DataInputStream(InputStream)

java.io.BufferedOutputStream(OutputStream)

java.util.zip.ZipOutputStream(OutputStream)

java.util.Collections#checked<list |sortedmap |sortedset |set |map>

5,шаблон «Фасад»

Предоставить простой интерфейс для группы компонентов, интерфейсов, абстракций или подсистемы

java.lang.Class

javax.faces.webapp.FacesServlet

6,паттерн «Приспособленец»

Использование кэша для ускорения доступа к большому числу мелких объектов

java.lang.Integer#valueOf(int)

java.lang.Boolean#valueOf(boolean)

java.lang.Byte#valueOf(byte)

java.lang.Character#valueOf(char)

7,паттерн «Заместитель»

Шаблон «Заместитель» использует простой объект вместо сложного объекта или объекта, создание которого требует много времени.

java.lang.reflect.Proxy

RMI


Иллюстрация, изображающая проектирование программного обеспечения через кофейную чашку Java и сцену сборки

Второе,порождающие паттерны

1,паттерн «Абстрактная фабрика»

Паттерн «Абстрактная фабрика» предоставляет протокол создания семейства связанных или независимых объектов без указания их конкретных типов. Он позволяет отделить приложение от конкретной реализации используемого фреймворка. Этот паттерн повсеместно встречается в JDK и во многих фреймворках, например Spring. Его также легко распознать: если метод создаёт новый объект, но возвращает интерфейс или абстрактный класс, это и есть паттерн «Абстрактная фабрика»

java.util.Calendar#getInstance()

java.util.Arrays#asList()

java.util.ResourceBundle#getBundle()

java.sql.DriverManager#getConnection()

java.sql.Connection#createStatement()

java.sql.Statement#executeQuery()

java.text.NumberFormat#getInstance()

javax.xml.transform.TransformerFactory#newInstance()

2,Шаблон «Строитель»(Builder)

Определяется новый класс для создания экземпляров другого класса, что упрощает создание сложных объектов. В паттерне «Строитель» также часто используется цепочка вызовов методов

java.lang.StringBuilder#append()

java.lang.StringBuffer#append()

java.sql.PreparedStatement

javax.swing.GroupLayout.Group#addComponent()

3,Фабричный метод

Это просто метод, возвращающий конкретный объект

java.lang.Proxy#newProxyInstance()

java.lang.Object#toString()

java.lang.Class#newInstance()

java.lang.reflect.Array#newInstance()

java.lang.reflect.Constructor#newInstance()

java.lang.Boolean#valueOf(String)

java.lang.Class#forName()

4,Паттерн «Прототип»

Позволяет экземплярам класса создавать собственные копии. Если создание экземпляра объекта очень сложно и требует много времени, можно использовать этот паттерн: вместо создания нового экземпляра скопировать объект и сразу изменить его

java.lang.Object#clone()

java.lang.Cloneable

5,паттерн «Одиночка»

используется, чтобы у класса был только один экземпляр. Джошуа Блох в книге Effetive Java рекомендует ещё один способ — использовать перечисление

java.lang.Runtime#getRuntime()

java.awt.Toolkit#getDefaultToolkit()

java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

java.awt.Desktop#getDesktop()


Три,модели поведения

1,шаблон «Цепочка обязанностей»

Уменьшение связанности объектов путём передачи запроса от одного объекта следующему в цепочке, пока запрос не будет обработан

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

2,паттерн «Команда»

Инкапсулировать операции в объекте для хранения, передачи и возврата

java.lang.Runnable

javax.swing.Action

3,паттерн «Интерпретатор»

Этот паттерн обычно определяет грамматику языка, а затем разбирает выражения, соответствующие этой грамматике

java.util.Pattern

java.text.Normalizer

java.text.Format

4,Шаблон «Итератор»

Предоставляет единый способ последовательного доступа к объектам коллекции, не зависящий от конкретной реализации самой коллекции

java.util.Iterator

java.util.Enumeration

5,паттерн «Посредник»

Использование промежуточного объекта для распределения сообщений и уменьшения прямых зависимостей между классами

java.util.Timer

java.util.concurrent.Executor#execute()

java.util.concurrent.ExecutorService#submit()

java.lang.reflect.Method#invoke()

6,паттерн «Снимок»

Создаёт снимок состояния объекта, чтобы тот мог восстановить исходное состояние, не раскрывая своего содержимого. Объект Date реализует паттерн «Снимок» с помощью хранящегося внутри значения типа long

java.util.Date

java.io.Serializable

7,паттерн «Нулевой объект»

Этот паттерн заменяет отсутствие объекта объектом без содержательной функциональности. Благодаря этому не требуется отдельно обрабатывать отсутствие объекта

java.util.Collections#emptyList()

java.util.Collections#emptyMap()

java.util.Collections#emptySet()

8,Шаблон «Наблюдатель»

Он позволяет объекту гибко отправлять сообщения заинтересованным объектам

java.util.EventListener

javax.servlet.http.HttpSessionBindingListener

javax.servlet.http.HttpSessionAttributeListener

javax.faces.event.PhaseListener

9,Паттерн «Состояние»

Изменяя внутреннее состояние объекта, можно динамически менять его поведение во время выполнения

java.util.Iterator

javax.faces.lifecycle.LifeCycle#execute()

10,паттерн «Стратегия»

Используйте этот паттерн, чтобы инкапсулировать набор алгоритмов в виде серии объектов. Передавая эти объекты, можно гибко менять функциональность программы

java.util.Comparator#compare()

javax.servlet.http.HttpServlet

javax.servlet.Filter#doFilter()

11,Паттерн «Шаблонный метод»

Позволяет подклассам переопределять часть метода, а не весь метод целиком; вы можете управлять тем, какие операции подклассы должны переопределять

java.util.Collections#sort()

java.io.InputStream#skip()

java.io.InputStream#read()

java.util.AbstractList#indexOf()

12,Паттерн «Посетитель»

Предоставляет удобный и простой в сопровождении способ работы с группой объектов. Позволяет изменять или расширять поведение объектов, не изменяя сами обрабатываемые объекты

javax.lang.model.element.Element и javax.lang.model.element.ElementVisitor

javax.lang.model.type.TypeMirror и javax.lang.model.type.TypeVisitor

Примечание переводчика:многие моменты могут вызывать споры; принадлежность к тому или иному паттерну сама по себе не особенно важна, важно то, какие уроки их устройство может дать для улучшения нашего кода


Комментарии

Отправка

Выберите оформление

Выбранное оформление применяется ко всему сайту.