【问题标题】:Java, Base64: How to write a Base64OutputStream class using Decorator PatternJava,Base64:如何使用装饰器模式编写 Base64OutputStream 类
【发布时间】:2012-02-12 08:26:57
【问题描述】:

基于我原来的question about RSA and Base64 encoding 和那里的 cmets,我想知道编写 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 装饰它?

【问题讨论】:

  • 嗨 lanoxx,您让我对您其他问题中的设计发表评论。正如我所说,我个人宁愿将 Writer 作为父级(对于编码器),因为它使字符编码错误更难发生(例如,在写入包含 UTF-16 字符的流时)。否则,我建议您查看 Brent Wordens 的答案并复制 Apache 界面(例如换行处理)。严重缺乏的一件事是正确的异常处理,您可能想要解决这个问题。如果您愿意,我可以粘贴 Java 1.5 或更高版本的基于状态的实现。

标签: java base64 decorator


【解决方案1】:

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

【讨论】:

  • 谢谢,我在那里看了,这也不能完全回答我所有的问题,代码很有用。但是我不明白为什么他们会覆盖这么多方法。
  • @lanoxx 重写方法比你的方法多的原因是问题不像给定的字节编码那么简单。例如,用你的 os.write("ab".getBytes()); os.write("cd".getBytes());产生与 os.write("abcd".getBytes()); 不同的输出
【解决方案2】:

就您对装饰器设计模式的实现而言,我认为您遗漏了一个关键部分。我可能弄错了,但我在学校学习装饰器模式的方式需要允许添加动态行为,并且它还在您的界面和新添加的类之间创建了一个抽象层。

我看到您正在向新创建的类添加“writeln()”方法,但这是一个简单的方法添加,它本身并不构成装饰器 DP 的基础。

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

设计模式的存在是为了解决您可能遇到的概念问题,据我了解,将装饰器模式添加到您的应用程序不会给您带来很多好处。但话又说回来,我不知道你在宏伟的计划中想要完成什么。

这是一个我在尝试为学校作业建模应用程序时发现有用的网站,也许您已经偶然发现它,它很好地解释了装饰器模式,它还包含可能实现的有价值的示例:http://www.dofactory.com/Patterns/PatternDecorator.aspx

希望这能回答您的第三个问题,祝您好运! :)

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 2012-10-28
    • 2015-03-24
    • 1970-01-01
    • 2013-05-07
    • 2021-04-19
    • 2012-02-29
    • 2014-12-31
    • 2020-02-29
    相关资源
    最近更新 更多