java что такое декоратор пример в io
Декоратор на Java
Декоратор — это структурный паттерн, который позволяет добавлять объектам новые поведения на лету, помещая их в объекты-обёртки.
Декоратор позволяет оборачивать объекты бесчисленное количество раз благодаря тому, что и обёртки, и реальные оборачиваемые объекты имеют общий интерфейс.
Особенности паттерна на Java
Сложность:
Популярность:
Применимость: Паттерн можно часто встретить в Java-коде, особенно в коде, работающем с потоками данных.
Примеры Декораторов в стандартных библиотеках Java:
Признаки применения паттерна: Декоратор можно распознать по создающим методам, которые принимают в параметрах объекты того же абстрактного типа или интерфейса, что и текущий класс.
Шифрование и сжатие данных
Пример показывает, как можно добавить новую функциональность объекту, не меняя его класса.
Сначала класс бизнес-логики мог считывать и записывать только чистые данные напрямую из/в файлы. Применив паттерн Декоратор, мы создали небольшие классы-обёртки, которые добавляют новые поведения до или после основной работы вложенного объекта бизнес-логики.
Первая обёртка шифрует и расшифрует данные, а вторая — сжимает и распакует их.
Мы можем использовать обёртки как отдельно друг от друга, так и все вместе, обернув один декоратор другим.
Декоратор на других языках программирования
Купи книгу Погружение в Паттерны и получи архив с десятками детальных примеров, которые можно открывать прямо в IDE.
Java Blog
Паттерн Декоратор (Decorator) в Java
Паттерн Декоратор (Decorator) относится к структурным паттернам проектирования. С его помощью можно прикрепить дополнительные обязанности к объекту динамически. Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности.
Простыми словами паттерн Декоратор позволяет динамически изменять поведение объекта во время выполнения, оборачивая их в объект класса декоратора.
В объектно-ориентированном программировании паттерн декоратор является паттерном проектирования, который позволяет добавлять поведение к отдельному объекту, статически или динамически, без влияния на поведение других объектов того же класса. Паттерн декоратор часто полезен для соблюдения принципа единой ответственности, так как он позволяет разделить функциональные возможности между классами с уникальными проблемными областями.
Пример паттерна декоратор на Java
Существует интерфейс Car.
Чтобы сделать из простого автомобиля скоростной спортивный автомобиль у нас есть класс-декоратор SportCar, который в конструкторе принимает класс SimpleCar и добавляет скорости обычному автомобилю.
Также чтобы увеличить грузоподъемность простого автомобиля у нас есть класс-декоратор Truck, который в конструкторе принимает класс SimpleCar и добавляет грузоподъемности обычному автомобилю.
Используем обычный автомобиль SimpleCar, превращая его с помощью декораторов в спортивный автомобиль или грузовик.
Декорирование классов java.io
Трудно переоценить значимость пакета java.io: он поддерживает систему ввода-вывода в Java. В качестве источника ввода или места вывода могут выступать файл, сетевое соединение, консоль. Все устройства описываются единой абстракцией – потоком (stream).
В пакете java.io множество классов и интерфейсов, предназначенных для работы с байтовыми и символьными потоками, сериализацией объектов. Их разнообразие по началу может смущать, а последовательность использования не выглядит очевидной. Помочь с осмыслением может Декоратор.
Паттерн Декоратор динамически наделяет объект новыми возможностями и является гибкой альтернативой субклассированию в области расширения функциональности.
Теперь взглянем на часть иерархии классов в java.io.
На схеме InputStream – абстрактный компонент. Конкретные компоненты: FileInputStream, StringBufferInputSteam, ByteArrayInputStream, ObjectInputStream и др.
Абстрактный декоратор – FilterInputStream, его потомки – конкретные декораторы:
Иногда бывает полезным создать свою систему декораторов. Предположим, необходимо организовать поиск файлов в каталоге.
Используем следующие фильтры:
В примере ниже осуществляется поиск всех текстовых файлов, в имени которых встречаются “io” и “java”, с длинной имени файла не меньше 4:
Понятно, что данные классы позволяют накладывать на искомые файлы произвольное число условий в произвольной последовательности, что возвращает нас к неограниченным возможностям декорирования.
Идея и определение паттерна из книги Эрика Фримен и Элизабет Фримен«Паттерны проектирования».
Если Вам понравилась статья, проголосуйте за нее
Голосов: 10 Голосовать
Декоратор Java: пример паттерна, шаблон проектирования на языке Java
Декоратор Java — это структурный паттерн, который используется при динамическом проектировании объекта. То есть при помощи этого паттерна можно к объекту «прикрутить» дополнительные свойства функциональности.
заменить колеса на легкосплавные;
убрать все лишн е е из салона;
в крайнем случае поменять двигатель на более мощный.
То есть вы не бежите сразу в салон за новым автомобилем, хотя не исключено, что кто-то именно так и делает.
Д екоратор Java дает возможность в динамическом режиме менять функциональность объекта, прямо в режиме его выполнения, применяя к нему классы паттерна. При этом не происходит никакого дополнительного влияния на другие объекты того же класса.
Декоратор Java
Паттерн декоратор Java применяется тогда, когда:
нужно изменить функциональность какого-то объекта в динамическом режиме, не трогая другие объекты;
нужно снять обязанности с какого-нибудь объекта;
невозможно или нецеле с ообразно использовать подклассы.
Паттерн декоратор Java на примере
public interface Bike <
public int getSpeed();
public int getHisWeight();
И в наличии будет стандартный мотоцикл с классом Standar d Bike:
public class Standar d Bike implements Bike <
private int speed = 40;
private int HisWeight = 90;
public int getSpeed() <
public int getHisWeight() <
Если вдруг мы захотим из нашего простого мотоцикла сделать полноценный гоночный спортбайк, то для этого у нас есть в декораторе класс SportBike. Он на себя принимает класс Standar d Bike и прибавляет нашему стандартному мотоциклу скорость:
public class SportBike implements Bike <
public SportBike(Bike bike)<
public int getSpeed() <
return this.bike.getSpeed() + 60;
public int getHisWeight() <
Вот и получилось, что из обычного мотоцикла мы сделали полноценный спортбайк:
public static void main(String[] args) <
Bike standar d Bike = new Standar d Bike();
System.out.println(«Стандартный мотоцикл может принимать вес» + String.valueOf(standar d Bike.getHisWeight()));
Bike sportBike = new SportBike(standar d Bike);
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Русские Блоги
Просмотр библиотеки Java / IO в режиме декоратора и адаптера
Просмотр библиотеки Java / IO в режиме декоратора и адаптера
1. Введение (введение в Java в двух словах)
Например, программа может использовать класс FileInputStream для чтения данных из файла на диске, как показано на следующем рисунке:
Такие процессоры, как FileInputStream, называются потоковыми процессорами и похожи на конвейер потоков, всасывающий определенные типы данных из источника потока и выводящий определенные типы данных. Вышеприведенная принципиальная схема называется диаграммой потока.
По той же причине вы также можете использовать класс FileOutputStream для записи данных в файл на диске, как показано на следующем рисунке:
Это не очень полезно при практическом применении этого механизма. Программы, как правило, должны записывать очень структурированную информацию, поэтому эти данные байтового типа на самом деле представляют собой некоторые значения, текст, исходный код и т. Д. Библиотека ввода-вывода в Java предоставляет механизм, называемый цепочкой, который соединяет потоковый процессор с другим потоковым процессором и использует один из выходов в качестве входных данных для формирования канала потокового конвейера.
Например, потоковый процессор DataInputStream может принимать выходные данные потокового объекта FileInputStream в качестве входных данных и преобразовывать данные байтового типа в примитивный тип Java и данные типа String. Как показано ниже:
Аналогично, запись данных типа байтов в файл не является простым процессом. Данные, которые программа должна записать в файл, часто структурированы, а тип Byte является исходным типом. Следовательно, он должен быть преобразован при написании. Потоковый процессор DataOutputStream предоставляет полученный необработанный тип данных и тип данных String, а выходные данные этого потокового процессора имеют тип Byte. Другими словами, DataOutputStream может преобразовать исходные данные в данные типа Byte и затем вывести их.
Таким образом, вы можете связать DataOutputStream и FileOutputStream, чтобы программа могла записывать исходный тип данных и исходные данные типа String в этот связанный двойной конвейер для достижения цели записи структурированных данных в файл на диске, Как показано ниже:
Это большая роль ссылок.
Поток, обрабатываемый процессором потока, должен иметь источник потока, и если источник потока, обрабатываемый классом потока, классифицируется, его можно в основном разделить на две категории:
Первый массив, строка, файл и т. Д. Этот вид называется исходным источником потока.
Второй Поток того же типа используется в качестве источника потока ссылок, называемого источником потока ссылок.
Принципы проектирования библиотеки ввода-вывода Java
Библиотека ввода-вывода языка Java представляет собой абстракцию различных общих источников потока, приемников и процедур обработки. Клиентской Java-программе не нужно знать конечный источник потока, является ли приемник файлом на диске или массивом и т. Д., А также не нужно заботиться о том, буферизуются ли данные и могут ли они считываться в соответствии с номером строки.
Библиотека ввода / вывода Java имеет две симметрии:
Symmet Симметрия ввода-вывода, такая как InputStream и OutputStream, каждый занимает корень двух параллельных иерархических структур ввода и вывода байтового потока. Reader и Writer каждый занимает корни двух параллельных иерархических структур ввода и вывода потока Char.
2-байтовая симметрия, подклассы InputStream и Reader отвечают за ввод потока Byte и Char соответственно, подклассы OutputStream и Writer соответственно отвечают за вывод потока Byte и Char и образуют параллельную иерархическую структуру соответственно.
Два шаблона проектирования библиотеки ввода-вывода Java:
Общий дизайн библиотеки ввода-вывода Java соответствует шаблону Decorator и шаблону Adapter. Как упоминалось ранее, класс, который обрабатывает потоки в этой библиотеке, называется классом потока. FileInputStream, FileOutputStream, DataInputStream и DataOutputStream, упомянутые во введении, являются примерами потоковых процессоров.
2 Режим адаптера. Внутри иерархической структуры, представленной InputStream, OutputStream, Reader и Writer, есть некоторые потоковые процессоры, которые адаптированы к другим типам потоковых источников. Это приложение режима адаптера, как показано ниже.
Режим адаптера применяется к проектированию исходного потокового процессора и является отправной точкой всех потоковых процессоров в библиотеке ввода-вывода.
Применение трех режимов украшения
Почему бы не использовать наследование и использовать декоративные узоры
Мы знаем, что библиотека ввода-вывода Java требует множества различных комбинаций производительности. Если эти комбинации производительности реализуются посредством наследования, то каждая комбинация требует класса, который вызовет много повторяющихся проблем. Так что количество классов «взрыв». Если используется режим декорирования, не только количество классов значительно сокращается, но и повторение производительности также может быть минимизировано. Таким образом, режим украшения является основным режимом библиотеки ввода-вывода Java. Здесь я хочу использовать пример декоративного рисунка в >, чтобы увидеть, как декоративный рисунок достигает не только большого количества классов, но и минимизации повторения производительности:
Вы видели диаграмму классов выше, мы не можем не сказать, что это «взрыв класса». Если это соответствует дизайнерской идее режима декорирования, мы можем нарисовать следующую диаграмму классов дизайна:
Давайте посмотрим на представление диаграммы классов стандартного режима оформления в Gof:
Внимательно рассмотрев приведенные выше рисунки, мы определенно поймем это предложение: как декоративный рисунок позволяет не только значительно сократить количество классов, но также можно свести к минимуму повторение производительности.
Возвращаясь к библиотеке ввода-вывода Java, гибкость и сложность были значительно увеличены благодаря ссылке на режим декорирования.Когда мы используем библиотеку ввода-вывода Java, мы должны понимать, что библиотека ввода-вывода Java состоит из некоторых основных исходных потоков. Процессор и окружающий их процессор декоративного потока составлены так, что при изучении и использовании библиотеки ввода-вывода Java достигается эффект умножения.
Ниже я использую >, > или некоторые диаграммы классов, которые можно увидеть в Интернете для анализа:
InputStream имеет семь прямых конкретных подклассов, и есть четыре конкретных подкласса, которые принадлежат FilterInputStream, как показано на следующем рисунке:
Все классы на рисунке выше называются потоковыми процессорами, а эта диаграмма называется (тип InputStream) потоковой диаграммой.
Упоминается, что в соответствии с типом источника входного потока эти классы потока можно разделить на два типа, а именно: исходный класс потока (Original Stream) и процессор потока ссылок (Wrapper Stream).
Необработанный потоковый процессор
Исходный потоковый процессор принимает объект массива байтов, объект String, объект FileDiscriptor или различные типы исходных объектов потока. Согласно приведенному выше рисунку исходный потоковый процессор включает в себя следующие четыре типа:
ByteArrayInputStream: Предоставляет функцию операции буфера для многопоточного взаимодействия и получает массив байтов в качестве источника потока.
FileInputStream: создать поток ввода, связанный с файлом. Получите объект File в качестве источника потока.
PipedInputStream: может использоваться вместе с PipedOutputStream для чтения данных из канала данных и получения PipedOutputStream в качестве источника.
StringBufferInputStream: преобразовать строковый буфер во входной поток. Получите объект String в качестве источника потока. (Справочный документ JDK гласит:Вышло из употребления.Этот класс не может правильно преобразовать символы в байты. Начиная с JDK1.1, предпочтительным способом создания потока из строки является его создание с помощью класса StringReader. Этот класс может использовать только младшие восемь битов каждого символа в строке. )
Процессор потока ссылок
(1) FilterInputStream называется входным потоком фильтра, который принимает другой входной поток в качестве источника потока. Подклассы этого класса включают в себя следующее:
BufferedInputStream: используется для чтения данных с жесткого диска в буфер памяти и предоставления данных из буфера.
DataInputStream: обеспечить многобайтовый метод чтения, может читать исходный тип данных.
LineNumberInputStream: Предоставляет отфильтрованный входной поток с функцией подсчета строк.
PushbackInputStream: Предоставляет специальную функцию, которая может «выталкивать» байты, которые были прочитаны во входной поток.
(2) ObjectInputStream может повторно распараллеливать исходные типы данных и объекты, сериализованные с использованием ObjectInputStream.
(3) SeqcueneInputStream может соединять два существующих входных потока для формирования входного потока, тем самым упорядочивая несколько входных потоков для формирования последовательности входного потока.
Абстрактная структурная схема
Согласно вышеупомянутому разделению исходного потокового процессора и процессора потоковой линии связи следующая структурная схема может использоваться для описания взаимосвязи между ними.
Вышеприведенная диаграмма потокового процессора, очевидно, такая же, как и схема структуры шаблона оформления. Фактически структура потокового процессора типа InputStream соответствует режиму оформления.
Структурная схема декоративного рисунка
Для приведенного выше представления FilterInputStream исходного кода JDK1.4 часть кода выглядит следующим образом:

