2012-01-17 5 views
1

オリジナルのquestion about RSA and Base64 encodingとそのコメントに基づいて、Base64OutputStream(またはInput Stream)を書き込む最良の方法は何か疑問に思っています。私は元々それをBase64PrintWriterと呼び、それをPrintWriterからPrintWriterをコンストラクタに渡して拡張しました。Java、Base64:デコレータパターンを使用してBase64OutputStreamクラスを書き込む方法

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. OutputStreamの代わりにFilteredOutputStreamを拡張するのは良いですか? Oracleはそれが良いことを示していますが、まだOutputStreamから拡張するには何らかの欠点や理由がありますか?
  5. コンストラクタを呼び出すと、BufferedOutputStreamでさらに装飾する必要がありますか?
+2

こんにちはlanoxx、あなたは他の質問のデザインにコメントするように頼まれました。私が言ったように、私は個人的には文字エンコーディングミスをするのが難しくなるため(UTF-16文字を含むストリームに書き込むときなど)Writer を親として(エンコーダ用に)個人的に持っています。それ以外の場合は、Brent Wordensの回答とApacheインターフェイスのコピー(例:改行処理)をお勧めします。それに欠けていることの1つは、適切な例外処理です。それを回避したいかもしれません。必要に応じて、Java 1の状態ベースの実装を貼り付けることができます。5以上。 –

答えて

2

オープンソースの使用に慣れている場合は、Apache Commons Codecをご覧ください。それにはあなたのニーズに合ったBase64OutputStreamが含まれています。

+0

ありがとう、私はそこに見ていた、これは正確にすべての私の質問に答えるわけではありませんコードは便利です。しかし、私はなぜそんなに多くのメソッドをオーバーライドするのかわかりません。 – lanoxx

+0

@lanoxxあなたよりも多くのオーバーライドされたメソッドがあるのは、与えられたバイトをエンコードするのと同じくらい簡単な問題ではないからです。たとえば、あなたのos.write( "ab" .getBytes()); os.write( "cd" .getBytes()); os.write( "abcd" .getBytes())とは異なる出力を生成します。 –

0

デコレータデザインパターンの実装が進む限り、私はあなたが重要な部分を欠いていると思います。私は間違っているかもしれませんが、学校でデコレータパターンを学んだ方法では、動的な振る舞いの追加を可能にする必要があり、インターフェースと新しく追加されたクラスの間に抽象レイヤーが作成されます。

新しく作成したクラスに 'writeln()'メソッドを追加していますが、これは単純なメソッドの追加であり、それ自体はDecorator DPの基礎とはなりません。

デコレータDPが望んでいることは、デコレータ(通常は抽象クラス)である抽象化レイヤを作成することです。そしてそのデコレータはあなたの新しいクラスの親になります。あなたのケースでは、Base64OutputStreamは、デコレータの子になります。

デザインパターンは、あなたが遭遇するかもしれない概念上の問題を解決するためにあります。私が理解しているところから、アプリケーションにデコレータパターンを追加することはあなたにとって大きな利益をもたらさないでしょう。しかし、やはり私はあなたが物事の壮大な計画で達成しようとしていることを知らない。

学校の仕事のためにアプリケーションをモデル化しようとしたときに役立つサイトがあります。それはすでに偶然見つかっているでしょうし、デコレータパターンについてもかなりよく説明しています。http://www.dofactory.com/Patterns/PatternDecorator.aspx

これは、あなたの3番目の質問と幸運にお答えします。 :)

関連する問題