"Olá, amigo! Hoje eu gostaria de contar a você os motivos pelos quais as interfaces existem. Você costuma ouvir que uma determinada classe, objeto ou entidade suporta uma determinada interface. O que significa suportar uma interface ? "

Interfaces existem para suportar comportamentos específicos - 1

Em um sentido mais amplo, qualquer interface é um mecanismo para algo interagir com outra coisa. Por exemplo, um controle remoto de TV é uma interface remota. Um cão entende e executa comandos, o que significa que o cão suporta uma interface de voz (controle). Resumindo, podemos dizer que uma interface é uma forma padronizada de duas coisas interagirem, onde ambas as partes conhecem o padrão. Quando uma pessoa diz a um cachorro para "sentar", seu comando faz parte de uma «interface de controle de voz de cachorro» e, se o cachorro obedece ao comando, dizemos que o cachorro suporta a interface.

Assim é na programação. Métodos são ações executadas em um objeto, em seus dados. E se uma classe implementa certos métodos, então ela «suporta a execução» de certos comandos. O que ganhamos combinando métodos em uma interface?

1) Cada interface , assim como uma classe , tem um nome único. Ambas as partes podem ter 100% de certeza de que a outra parte oferece suporte à interface exata que eles conhecem e não a uma interface semelhante.

2) Cada interface impõe certas restrições a uma classe que irá suportá-la. A classe (seu desenvolvedor) decide o que fará quando os métodos herdados de uma interface forem chamados, mas o resultado deve estar dentro dos limites das expectativas razoáveis. Se ordenarmos a um cachorro que "sente" e então ele rolar no lugar por 5 minutos e então sentar, então ele suporta a interface. Mas se, em vez disso, agarrar você pela perna, dificilmente podemos dizer que suporta a interface. A execução do comando não produziu o resultado esperado.

Digamos que você e seus amigos estejam escrevendo um jogo de computador. E você foi designado para programar o comportamento de um personagem. Um de seus colegas já escreveu um código para exibir todos os caracteres na tela. Um segundo colega, responsável por salvar o jogo no disco, escreveu um código para salvar todos os objetos do jogo em um arquivo. Cada um deles escreveu muito código e criou uma interface para interagir com esse código. Por exemplo, pode ser assim:

código Java Descrição
interface Saveable
{
 void saveToMap(Map<String, Object> map);
 void loadFromMap(Map<String, Object> map);
}
— Interface para armazenar/carregar um objeto de um mapa.
interface Drawable
{
 void draw(Screen screen);
}
— Interface para desenhar um objeto dentro do objeto de Tela passado.
class PacMan implements Saveable, Drawable
{
…
}
— Sua classe, que suporta duas interfaces.

Em outras palavras, para suportar qualquer interface (grupo de interfaces), sua classe deve:

1) Herde-os

2) Implemente os métodos declarados neles

3) Os métodos devem fazer o que foram planejados para fazer.

Então o resto do código do programa, que não sabe nada sobre sua classe e seus objetos, pode funcionar com sua classe.

"Por que o código não pode saber nada sobre minha classe?"

"Digamos que você pegou o código de um programa que alguém escreveu há um ano. Ou suponha que seus amigos compraram/licenciaram o mecanismo de jogo de outra pessoa. Você tem um código funcional para o jogo. Milhares de objetos que interagem entre si. E eles pode facilmente interagir corretamente com seus objetos se você fizer essa interação acontecer por meio de interfaces que suas classes implementaram corretamente."

"Longe! Eu não sabia que isso era possível."

"Todos os grandes projetos funcionam assim. As pessoas pararam de escrever do zero há muito tempo."

As pessoas também não reinventam a matemática e o alfabeto todas as vezes. Em vez disso, eles estudam tudo o que foi inventado antes deles.