7.2 Diminuindo acoplamento com Interfaces
O uso da interface já nos ajudou a resolver o problema de polimorfismo de nossos produtos. Agora há uma forma simples e flexível para representar qualquer Produto de nossa livraria. Mas ainda precisamos resolver o problema do método aplicaDescontoDe.
Ao adicionar esse método abstrato na classe Livro, obrigamos todas as suas subclasses a implementá-lo, mas não é bem isso que precisamos. Essa solução deixa de ser interessante quando nem todos os Livros tenham esse comportamento, como é o caso do MiniLivro, que não pode ter um desconto.
Outra questão é que apenas os filhos da classe Livros têm essa obrigação, sendo que uma Revista também deve possuir o método aplicaDescontoDe. Podemos diminuir esse acoplamento de uma forma bem simples, criando uma nova interface! Vamos chamá-la de Promocional:
public interface Promocional {
boolean aplicaDescontoDe(double porcentagem);
}
Agora podemos remover o método aplicaDescontoDe abstrato da
classe Livro e dizer que apenas as classes promocionais, que possuem desconto, implementam essa nova interface:
public class LivroFisico extends Livro implements Promocional {// atributos e metodos omitidos
}
public class Ebook extends Livro implements Promocional {// atributos e metodos omitidos
}
public class Revista implements Produto, Promocional {