Занятия для кодирования и декодирования изображений


Я разрабатывает процессор обработки изображений, который читает в base64 (сжатый) изображение и записывает его фрагменте в targets на нити.

(Конструкторы, обработки исключений и управления ресурсами опущены для краткости)

В базовый абстрактный класс является AbstractImageProcessor и он реализует Runnable для работы на темы:

abstract class AbstractImageProcessor implements Runnable {
    protected final String base64; // input
    protected final List<Target> targetList; // list of target information

    protected abstract void read(byte[] data);
    protected abstract void write(Target t);

    @Override
    public void run() {
        byte[] data = decompress(decode()); // decode base64 and decompress
        read(data);
        for (Target t : targetList) {
            write(t)
        }
    }
}

Еще один абстрактный класс, ImageIOProcessor распространяется AbstractImageProcessor использовать ImageIO:

abstract class ImageIOProcessor extends AbstractImageProcessor {
    private BufferedImage image;

    protected abstract void writeBufferedImage(BufferedImage subimage, Target t)

    @Override
    protected void read(byte[] data) {
        image = ImageIO.read(new ByteArrayInputStream(data));
    }

    @Override
    protected void write(Target t) {
        writeBufferedImage(image.getSubimage(/* x, y, w, h from t */), t);
    }
}

Есть два стандартных реализаций(бетон классаА) ImageIOProcessorодин пишет в файл, а другой пишет в base64 строку:

class ImageIOFileWriter extends ImageIOProcessor {
    private File filepath;

    @Override
    protected void writeBufferedImage(BufferedImage subimage, Target t) {
        ImageIO.write(subimage, "png", filepath);
    }
}

class ImageIOBase64Writer extends ImageIOProcessor {
    @Override
    protected void writeBufferedImage(BufferedImage subimage, Target t) {
        ImageIO.write(subimage, "png", /* Base64-encoder-wrapped outputstream*/);
    }
}

В заводской интерфейс отвечает за создание соответствующей обработки изображений Runnable экземпляр:

public interface ImageProcessorFactory {
    AbstractImageProcessor create(String base64, List<Target> t);
}

Это лучший способ, чтобы реализовать их? Или есть ли лучший шаблон проектирования?



Комментарии
1 ответ

Несколько незначительных вещей:


  1. Некоторые люди всегда заявляют, какие интерфейсы, реализуемые классом, для ясности. Таким образом, вы могли бы иметь свой подклассы AbstractImageProcessor также укажите implement Runnable.

  2. По консистенции, я бы переименовать ImageIOProcessor для AbstractImageIOProcessor.

  3. Не так уж мало, я бы метод create в ImageProcessorFactory чтобы вернуть интерфейс, ни абстрактный класс.

  4. В названии не просто, возможно, вы могли бы найти лучшую альтернативу ImageIOFileWriter и ImageIOBase64Writerпотому что они не только изображения писателей, они тоже читала. Они являются процессорами как другие классы.

  5. У вас есть любой другой класс расширение AbstractImageProcessor кроме того ImageIOProcessor? Если нет, возможно, Вам не нужны обе.

3
ответ дан 26 мая 2018 в 06:05 Источник Поделиться