O Princípio Aberto-Fechado (Open-Closed Principle) é um concieto fundamental em engenharia de software que afirma que entidades de software, como classes, módulos ou funções, devem estar abertas para extensão, mas fechadas para modificação. Isso significa que o comportamento do sistema pode ser estendido sem alterar o código existente, promovendo manutenibilidade e escalabilidade.
Para implementar esse princípio, é comum utilizar abstrações, como interfaces ou classes abstratas. Abstrações bem definidas fornecem uma base estável, permitindo que novas funcionalidades sejam adicinoadas através de novas implementações, sem impactar o código que já está em produção.
Considere um exemplo prático com um editor de texto que suporta temas visuais. Os temas podem incluir cores de fundo, fontes e estilos de interface. Os usuários podem alternar entre temas ou adicionar novos temas personalizados, sem necessidade de modificar o editor em si.
Para modelar isso, defina uma classe abstrata TemaAbstrato que declare métodos comuns, como aplicar(). Cada tema específico, como TemaEscuro ou TemaClaro, herda dessa classe e fornece sua implementação. O editor pode usar qualquer implementação de TemaAbstrato, permitindo extensão sem alteração.
Abaixo, um exemplo em Java que demonstra essa estrutura. A classe EditorTexto depende de uma abstração de tema, e novos temas podem ser adicionados criando-se novas subclasses.
package com.example.design.principles;
public class EditorTexto {
private TemaAbstrato temaAtual;
public void definirTema(TemaAbstrato tema) {
this.temaAtual = tema;
}
public void exibirInterface() {
temaAtual.aplicar();
}
}
package com.example.design.principles;
public abstract class TemaAbstrato {
public abstract void aplicar();
}
package com.example.design.principles;
public class TemaEscuro extends TemaAbstrato {
@Override
public void aplicar() {
System.out.println("Aplicando tema escuro com cores escuras.");
}
}
package com.example.design.principles;
public class TemaClaro extends TemaAbstrato {
@Override
public void aplicar() {
System.out.println("Aplicando tema claro com cores claras.");
}
}
package com.example.design.principles;
public class Demonstracao {
public static void main(String[] args) {
EditorTexto editor = new EditorTexto();
TemaEscuro temaPadrao = new TemaEscuro();
editor.definirTema(temaPadrao);
editor.exibirInterface();
}
}
Se surgir a necessidade de um novo tema, como TemaPersonalizado, basta criar uma nova classe que estenda TemaAbstrato e implementar o método aplicar(), sem alterar nenhuma das classes existentes, como EditorTexto ou os temas anteriores.