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());
Мои вопросы:
- Это хороший дизайн?
- Можно ли сделать это лучше?
- Правильно ли я применил рисунок декоратора?
- Это хорошо, чтобы расширить FilteredOutputStream вместо OutputStream? Oracle указывает, что это хорошо, но есть ли какие-либо недостатки или причины, по-прежнему выходящие из OutputStream?
- И должен ли я дополнительно украсить его с помощью BufferedOutputStream, когда я вызываю конструктор?
2 ответа
Если вы можете использовать открытый исходный код, вы можете взглянуть на кодек Apache Commons. Он содержит Base64OutputStream, который должен соответствовать вашим потребностям.
Что касается вашей реализации шаблона оформления декоратора, я думаю, что вы упускаете важную часть. Я могу ошибаться, но способ, которым я изучил Шаблон Декоратора в школе, должен позволить динамическое добавление поведения, и это также создает слой абстракции между вашим интерфейсом и вновь добавленным классом.
Я вижу, что вы добавляете метод writeln() в свой только что созданный класс, но это простое добавление метода, которое само по себе не составляет основу Decorator DP.
DP-дизайнер Decorator хочет, чтобы вы создали абстракционный слой - декоратор (обычно это абстрактный класс). И этот декоратор станет родителем вашего нового класса (классов), в вашем случае Base64OutputStream станет потомком указанного декоратора.
Шаблоны проектирования предназначены для решения проблем зачатия, с которыми вы можете столкнуться, насколько я понимаю, добавление шаблона декоратора в ваше приложение не принесет вам большой пользы. Но опять же, я не знаю, чего ты пытаешься достичь в общей схеме вещей.
Вот сайт, который я считаю полезным при попытке смоделировать приложения для школьной работы, возможно, вы уже наткнулись на него, он довольно хорошо объясняет шаблон Decorator, а также содержит ценные примеры возможной реализации: http://www.dofactory.com/Patterns/PatternDecorator.aspx.
Надеюсь, что это ответит на ваш третий вопрос и удачи!:)