Boa noite Carlos, tudo bem?
A redução de código não está associada às implementações da interface pois é necessário escrever a lógica em cada implementação. A diminuição de duplicidade de código acontece no momento de uso das implementações, pois essas podem ser substituídas pela interface conforme exemplo.
public interface Arquivo {
void imprime();
}
public class ArquivoPDF implements Arquivo {
@Override
public void imprime() {
System.out.println("Imprimindo PDF");
}
}
public class ArquivoTexto implements Arquivo {
@Override
public void imprime() {
System.out.println("Imprimindo Texto");
}
}
public class Impressora {
/*
O metodo imprimir recebe como parametro qualquer implementação que assine o contrato
Arquivo, logo não precisamos duplicar código para ter métodos específicos de impressão para PDF e Texto.
*/
public void imprime(Arquivo arquivo) {
arquivo.imprime();
}
}
public class TesteInterface {
public static void main(String[] args) {
ArquivoPDF pdf = new ArquivoPDF();
ArquivoTexto texto = new ArquivoTexto();
Impressora impressora = new Impressora();
impressora.imprime(pdf);
impressora.imprime(texto);
}
}