Suponha que tem a seguinte classe Document (que representa um documento de texto):


public class Document {
  private String _text;
  private DocumentFormat _format;
  ...  
  public void setWritingFormat(DocumentFormat format) {
    _format = format;
  }
  /**
   * Writes this document into the specified format.
   **/
  public void write() {
     if (_format == WORD) {
        // write document into word format     
     } else if (_format == RTF) {
       // write document into RTF format
    } else if ... // code for other formats
  }
}
Esta classe tem um custo de manutenção alto devido ao facto de ter que se preocupar com os diferentes formatos de saída suportados. Além disso, caso se queira suportar novos formatos de saída, isto implicará alterações na própria classe, não se seguindo assim o princípio do aberto/fechado.

Qual o padrão a aplicar neste caso para resolver os dois problemas indicados?

Exemplifique a aplicação do padrão escolhido realizando as alterações necessárias à classe Document.