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.

Aplique o padrão de desenho correcto que resolve estes problemas.  Exemplifique a aplicação do padrão escolhido realizando as alterações necessárias à classe Document e considerando apenas a escrita de um documento no formato Word. Por razões de simplificação, considere que a escrita de um documento neste formato se resume apenas a escrever a cadeia de caracteres "Formato Word" para o terminal.