Java,Base64:如何使用Decorator Pattern编写Base64OutputStream类

基于我关于RSA和Base64编码的原始问题及其中的注释,我想知道编写Base64OutputStream(或输入流)的最佳方法是什么。 我最初称它为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另外装饰它?

如果您可以使用开源,可以查看Apache Commons Codec 。 它包含一个满足您需求的Base64OutputStream 。

至于你的Decorator设计模式的实现,我认为你错过了一个关键部分。 我可能会误以为但是我在学校学习装饰模式的方式需要允许添加动态行为,它还会在您的界面和新添加的类之间创建一个抽象层。

我看到你正在为你新创建的类添加’writeln()’方法,但这是一个简单的方法添加,它本身并不构成Decorator DP的基础。

Decorator DP要求你做的是创建一个抽象层,一个装饰器(通常是一个抽象类)。 并且该装饰器将成为您的新类的父级,在您的情况下,Base64OutputStream将成为所述装饰器的子级。

设计模式是为了解决您可能遇到的概念问题,根据我的理解,将Decorator模式添加到您的应用程序不会对您有益。 但话又说回来,我不知道你在宏伟的计划中想要完成什么。

这是一个我在试图为学校作业建模时有用的网站,也许你已经偶然发现它,它很好地解释了Decorator模式,它还包括可能实现的有价值的例子: http : //www.dofactory.com /Patterns/PatternDecorator.aspx 。

希望这能回答你的第三个问题,祝你好运! 🙂