Топ контрибуторов
loading
loading
Знаете ли Вы, что

В разделе "Статьи" можно найти обучающие статьи по информационным технологиям, а также узнать о новостях сервиса Quizful.

Лента обновлений
ссылка 09:06:04
Комментарий от alex2005:
значение счётчика увеличивается после присвоения
ссылка Jun 17 08:57
Добавлен вопрос в тест HTML - Средний уровень
ссылка Jun 16 19:14
Комментарий от borgir:
Спасибо
ссылка Jun 16 18:49
Комментарий от vovannna:
public class LESSONS {
private int value = 1;

...
ссылка Jun 15 11:12
Комментарий от uuoweznv:
Присоединяюсь к предыдущим ораторам!
Что такое дополнит...
Статистика

Тестов: 153, вопросов: 8595. Пройдено: 435444 / 2136357.

Декорирование классов java.io

head tail Статья
дата30.01.2015
авторGalinaU
голосов10

Трудно переоценить значимость пакета java.io: он поддерживает систему ввода-вывода в Java. В качестве источника ввода или места вывода могут выступать файл, сетевое соединение, консоль. Все устройства описываются единой абстракцией – потоком (stream).

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

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

Декоратор

  • реализует тот же интерфейс или абстрактный класс, что и декорируемый компонент
  • содержит компонент (ссылка на компонент хранится в переменной экземпляра)
  • может расширить состояние компонента или добавить новые методы
схема Декоратор

Теперь взглянем на часть иерархии классов в java.io.

схема Декоратор

На схеме InputStream – абстрактный компонент. Конкретные компоненты: FileInputStream, StringBufferInputSteam, ByteArrayInputStream, ObjectInputStream и др.

Абстрактный декоратор – FilterInputStream, его потомки – конкретные декораторы:

  • BufferedInputStream - буферизует ввод для повышения производительности и дополняет интерфейс новым методом readLine() для построчного чтения символьных данных.
  • LineNumberInputStream - добавляет возможность подсчета строк в процессе чтения данных.

Иногда бывает полезным создать свою систему декораторов. Предположим, необходимо организовать поиск файлов в каталоге.
Используем следующие фильтры:


//минимальная длинна имени файла
            class MyFilterMinLength implements FilenameFilter{
                   FilenameFilter filter;
                   int minLength;
                   MyFilterMinLength(FilenameFilter filter,int minLength){
                              this.minLength=minLength;
                              this.filter=filter;
                   }
                   public boolean accept(File dir, String name){
                              return filter.accept(dir,name)&&(name.length()>=minLength);
                   }
            }
            //расширение файла
            class MyFilterExt implements FilenameFilter{
                   FilenameFilter filter;
                   String ext;
                   MyFilterExt(FilenameFilter filter,String ext){
                              this.ext=ext;
                              this.filter=filter;
                   }
                   public boolean accept(File dir, String name){
                              return filter.accept(dir,name)&&(name.endsWith("."+ext));
                   }
            }
            //вхождение substr  в имя файла
            class MyFilterEntry implements FilenameFilter{
                   FilenameFilter filter;
                   String substr;
                   MyFilterEntry(FilenameFilter filter,String substr){
                              this.substr=substr;
                              this.filter=filter;
                   }
                   public boolean accept(File dir, String name){
                              return filter.accept(dir,name)&&(name.indexOf(substr)>-1);
                   }
            }
            //первый фильтр без параметров
            class MyFilterFirst implements FilenameFilter{                                 
                   public boolean accept(File dir, String name){
                              return true;
                   }
            }

В примере ниже осуществляется поиск всех текстовых файлов, в имени которых встречаются “io” и “java”, с длинной имени файла не меньше 4:


public class DecoratorIO{
     public static void main(String[] args){
            File dir=new File("dir");
            FilenameFilter first=new MyFilterFirst();
            FilenameFilter filter=new MyFilterEntry(first,"io");
            filter=new MyFilterEntry(filter,"java");
filter=new MyFilterMinLength(filter,5); filter=new MyFilterExt(filter,"txt"); String nameList[]=dir.list(filter); for(String name:nameList){ System.out.println(name); } } }

Понятно, что данные классы позволяют накладывать на искомые файлы произвольное число условий в произвольной последовательности, что возвращает нас к неограниченным возможностям декорирования.

Литература:

Идея и определение паттерна из книги Эрика Фримен и Элизабет Фримен«Паттерны проектирования».

Если Вам понравилась статья, проголосуйте за нее

Голосов: 10  loading...
Gleb90   MaximKravetc   psk   PI_314   biuwsi   onehatedfate   ganzaev   ipergenitsa   maje16   augelite