Java, Base64: как написать класс Base64OutputStream, используя Pattern Decorator

Исходя из моего первоначального вопроса о кодировке RSA и Base64 и комментариев там, я задаюсь вопросом, каков наилучший подход для написания Base64OutputStream (или Input Stream). Первоначально я назвал его Base64PrintWriter и расширил его с PrintWriter, передавая PrintWriter Конструктору.

import org.bouncycastle.util.encoders.Base64;

public class Base64OutputStream extends FilterOutputStream {

    public Base64OutputStream(OutputStream out) {
        super(out);
    }

    public void write(byte[] decodedBytes) throws IOException {
        byte[] base64Message = Base64.encode(decodedBytes);
        super.write(base64Message);
    }

    public void writeln(byte[] decodedBytes) throws IOException {
        write(decodedBytes);
        super.write("\n".getBytes());
        super.flush();
    }
}

Я изменил свою первоначальную реализацию на приведенную выше и инициализирую ее с помощью:

Base64OutputStream base64encoder = new Base64OutputStream(socket.getOutputStream());

Мои вопросы:

  1. Это хороший дизайн?
  2. Можно ли сделать это лучше?
  3. Правильно ли я применил рисунок декоратора?
  4. Это хорошо, чтобы расширить FilteredOutputStream вместо OutputStream? Oracle указывает, что это хорошо, но есть ли какие-либо недостатки или причины, по-прежнему выходящие из OutputStream?
  5. И должен ли я дополнительно украсить его с помощью BufferedOutputStream, когда я вызываю конструктор?

2 ответа

Решение

Если вы можете использовать открытый исходный код, вы можете взглянуть на кодек Apache Commons. Он содержит Base64OutputStream, который должен соответствовать вашим потребностям.

Что касается вашей реализации шаблона оформления декоратора, я думаю, что вы упускаете важную часть. Я могу ошибаться, но способ, которым я изучил Шаблон Декоратора в школе, должен позволить динамическое добавление поведения, и это также создает слой абстракции между вашим интерфейсом и вновь добавленным классом.

Я вижу, что вы добавляете метод writeln() в свой только что созданный класс, но это простое добавление метода, которое само по себе не составляет основу Decorator DP.

DP-дизайнер Decorator хочет, чтобы вы создали абстракционный слой - декоратор (обычно это абстрактный класс). И этот декоратор станет родителем вашего нового класса (классов), в вашем случае Base64OutputStream станет потомком указанного декоратора.

Шаблоны проектирования предназначены для решения проблем зачатия, с которыми вы можете столкнуться, насколько я понимаю, добавление шаблона декоратора в ваше приложение не принесет вам большой пользы. Но опять же, я не знаю, чего ты пытаешься достичь в общей схеме вещей.

Вот сайт, который я считаю полезным при попытке смоделировать приложения для школьной работы, возможно, вы уже наткнулись на него, он довольно хорошо объясняет шаблон Decorator, а также содержит ценные примеры возможной реализации: http://www.dofactory.com/Patterns/PatternDecorator.aspx.

Надеюсь, что это ответит на ваш третий вопрос и удачи!:)

Другие вопросы по тегам