2012-01-17 1 views
1

내 원래 question about RSA and Base64 encoding 및 그 주석을 기반으로 Base64OutputStream (또는 Input Stream)을 작성하는 최선의 방법이 무엇인지 궁금합니다. 원래는 Base64PrintWriter라고하고 PrintWriter에서 PrintWriter를 전달하여 생성자로 확장했습니다. Java, Base64 : Decorator 패턴을 사용하여 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, 당신은 다른 질문에 디자인에 대한 의견을달라고 부탁했습니다. 내가 말했듯이 개인적으로 Writer 을 부모 (인코더)로 사용하는 것이 문자 인코딩 실수를 더 어렵게 만듭니다 (예 : UTF-16 문자가 포함 된 스트림에 쓰는 경우). 그렇지 않으면 Brent Wordens가 아파치 인터페이스 (예 : 줄 바꿈 처리)에 응답하고 복사하는 것을 권장합니다. 그로 인해 부족한 부분 중 하나는 적절한 예외 처리이며,이를 해결하려고 할 수 있습니다. 원하는 경우 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

Decorator Design Pattern의 구현이 진행되는 한, 당신은 중요한 부분을 놓치고 있다고 생각합니다. 내가 실수 할 수도 있지만 학교에서 데코레이터 패턴을 배웠던 방식으로 동적 동작 추가를 허용해야하며 인터페이스와 새로 추가 된 클래스 사이에 추상화 레이어를 만듭니다.

새로 작성한 클래스에 'writeln()'메소드를 추가하는 것을 보았습니다. 그러나 이는 간단한 메소드 추가이며 자체는 Decorator DP의 기초가 아닙니다.

Decorator DP가 수행하기를 원하는 것은 데코레이터 (일반적으로 추상 클래스) 인 추상화 레이어를 만드는 것입니다. 그리고 그 장식자는 여러분의 새로운 클래스의 부모가 될 것이고, 여러분의 경우 Base64OutputStream은 그 Decorator의 자식이 될 것입니다.

디자인 패턴은 내가 알기로 장식용 패턴을 응용 프로그램에 추가하면 전체적으로 많은 이점을 얻지 못할 수있는 개념 상 문제를 해결할 수 있습니다. 그러나 다시 나는 사물의 거대한 계획에서 당신이 성취하고자하는 것을 모른다.

학교 업무용 응용 프로그램을 모델링 할 때 유용하다고 생각한 사이트가 있습니다. 이미 우연히 발견했거나 Decorator 패턴을 잘 설명해 주었고 유용한 구현 예도 포함되어 있습니다 : http://www.dofactory.com/Patterns/PatternDecorator.aspx.

희망 사항은 세 번째 질문과 행운을 보냅니다. :)

관련 문제