Adapter
Este design pattern Adapter trata de uma maneira de fazer com que uma classe existente implemente uma interface de modo a ficar compatível com uma outra classe ou grupo de classes. Este pattern utiliza duas abordagens distintas: fazer com que a classe que deve ser adaptada implemente a interface esperada ou criar uma nova classe que implemente a interface esperada e guardar nela uma referência a classe original.
Imagine um sistema de envio de mensagens que utilize vários meios para relizar esse envio como redes sociais, SMS, etc, todos implementando uma interface MessageSender que define um método sendMessage para realizar o envio. E que em um outro sistema diferente exista implementado o envio de mensagens via email, em uma classe MailMessageHandler com o seu método sendEmail. Finalmente, utilizando o padrão Adapter podemos aproveitar o MailMessageHandler fazendo com que ele implemente a interface MessageSender.
Abordagem 1 - Extensão e Herança:
A primeira opção seria extender a classe MailMessageHandler criando uma nova classe MailSender que extendesse a interface MessageSender. O método sendMessage da nova classe realiza a chamada ao método sendEmail da sua classe pai e, dessa forma, conseguimos aproveitar toda a implementação original.
O esquema abaixo mostra o diagrama de classes dessa abordagem.

Abordagem 2 - Composição:
A segunda abordagem é criar uma nova classe MailSender que implemente a interface MessageSender guardando uma referência à classe MailMessageHandler original. Então a implementação do método sendMessage consiste em uma chamada do método senEmail da classe MailMessageHandler da qual ela guarda uma referência.
Mais uma vez temos um diagrama de classes para ilustrar essa implementação.
