Меня недавно задали этот вопрос во время моего собеседования, и я не мог ответить на него. Итак, каков наиболее используемый шаблон в java.io и как он используется? Каковы другие шаблоны, используемые в общих библиотеках java?
Каков наиболее используемый шаблон в java.io?
Ответ 1
Я думаю, они хотели услышать о Decorator pattern, который можно найти в различных потоках, читателях и писателях.
Другие шаблоны (небольшой выбор):
- шаблон наблюдателя в библиотеках swing
- Factory pattern в пакетах javax.xml.parsers
- шаблон итератора, используемый в коллекциях
Я уверен, что можно найти примеры почти всех шаблонов, перечисленных на этой странице
Ответ 2
BufferedReader
etc реализует шаблон декоратора, Любые Reader
, например. FileReader
или StringReader
, может быть украшенный функцией буферизации, которая действительно не интересует источник.
Другие шаблоны
-
java.util.Comparator<T>
является шаблон стратегии
Анти-паттерны
Чтобы добавить к словам других, это несколько анти-шаблонов в библиотеках Java:
Антипаттерн: наследование вместо композиции
Из эффективного Java 2nd Edition, пункт 16: предпочтение композиции над наследованием:
В библиотеках платформы Java существует ряд очевидных нарушений этого принципа. Например, стек не является вектором, поэтому
Stack
не должен расширятьVector
. Аналогично, список свойств не является хеш-таблицей, поэтомуProperties
не должен расширятьHashtable
. В обоих случаях композиция была бы предпочтительной.
Связанные вопросы
- Предпочитаете композицию над наследованием?
- java наследование против композиции (реализация стека)
- Разница между наследованием и составом
- Наследование или состав: полагаться на "есть-а" и "есть-а" ?
- Объектно-ориентированные рекомендации - Наследование v Состав v Интерфейсы
- Должен ли я использовать наследование или состав?
- Наследование и агрегирование
- Агрегация стихов Состав
- Декоратор с использованием композиции вместо наследования
Антипаттерн: постоянные интерфейсы
Из Effective Java 2nd Edition, пункт 19: Используйте интерфейсы только для определения типов:
В библиотеках платформы Java существует несколько постоянных интерфейсов, таких как
java.io.ObjectStreamConstants
. Эти интерфейсы следует рассматривать как аномалии и не следует эмулировать.
Связанные вопросы
- Должен ли класс реализовать интерфейс только для констант?
- Каков наилучший способ реализации констант в Java?
Антипаттерн: конструктор телескопов и шаблоны JavaBeans
Из эффективного Java 2nd Edition, пункт 2: рассмотрите построитель, столкнувшись со многими параметрами конструктора (выдержка в Интернете):
Традиционно программисты использовали шаблон конструктора телескопа, в котором вы предоставляете конструктор только с требуемыми параметрами, другой с одним необязательным параметром, третий с двумя необязательными параметрами и т.д. [...] Конструктор телескопирования шаблон работает, но писать код клиента сложно, когда есть много параметров, и еще сложнее записать его.
Вторая альтернатива, когда вы сталкиваетесь со многими параметрами конструктора, - это шаблон JavaBeans, в котором вы вызываете конструктор без параметров для создания объекта, а затем вызываете методы setter для установки каждого требуемого параметра и каждого необязательного параметра, представляющего интерес. [...] К сожалению, шаблон JavaBeans имеет серьезные недостатки в своем собственном [...] JavaBean может находиться в противоречивом состоянии частично через его конструкцию [и он] исключает возможность сделать класс неизменным.
Блох рекомендует вместо этого использовать шаблон компоновщика.
Связанные вопросы
Ответ 3
шаблон декоратора часто используется в java i/o.
Пример
BufferedReader br = new BufferedReader(new FileReader("filename.txt"));
Ответ 4
Рисунок декоратора, я думаю. Чтобы создать все вкусы читателей, писателей, потоков ввода и вывода. Например, этот.
Ответ 5
Шаблоны, используемые в пакете java.io.
-
Примеры:
Абстрактный класс java.io.FilterInputStream и его конкретные подклассы:
BufferedInputStream, CheckedInputStream
и т.д. -
Abstract_factory_pattern и Factory_method_pattern шаблоны:
Примеры:
Абстрактный класс InputStream и его конкретные подклассы:
ByteArrayInputStream, FileInputStream, FilterInputStream
и т.д.InputStream input = new FileInputStream("some_file.txt");
Ниже классы позволяют унифицировать ввод из байтового массива, файла, сетевого подключения, постоянного хранилища, трубы, строки и т.д.:
class java.io.InputStream class java.io.ByteArrayInputStream class java.io.FileInputStream class java.io.FilterInputStream class java.io.ObjectInputStream class java.io.PipedInputStream class java.io.SequenceInputStream class java.io.StringBufferInputStream
-
Примеры:
java.io.InputStreamReader
преобразует поток байтов в поток символов, аjava.io.OutputStreamWriter
преобразует поток символов в поток байтов.Вы можете найти более подробную информацию в этой статье
-
Template_method_pattern (источник: journaldev)
Все не абстрактные методы
java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer
.
Для всех других шаблонов в java обратитесь к этому сообщению:
Примеры шаблонов проектирования GoF в основных библиотеках Java