Desacopla a interface da implementação, o que permite que uma implementação não fique permanentemente presa a uma interface. A implementação de uma abstração pode ser configurada em tempo de execução. É até mesmo possível para um objeto mudar sua implementação em tempo de execução.
Encoraja , a partir desse desacoplamento, o uso de camadas que podem melhorar a estruturação de um sistema. A parte de alto nível de um sistema somente tem que ter conhecimento da abstração(Abstraction) e implementação (Implementor).
Permite estender as hierarquias da abstração (Abstraction) e da imprementação (Implementor) independentemente, ou seja possui uma extensibilidade melhorada.
Proteje e isola os clientes de detalhes de implementação, tais como compartilhamento de objetos Implementor e o mecanismo de contagem de referências que os acompanham (se houver).
Desvantagens
Um ponto que merece um certo cuidado é sobre a instanciação dos objetos, uma vez que é necessário especificar a abstração e utilizar uma implementação, assim o cliente precisa conhecer bem as classes, e o que elas realizam para saber exatamente o que, quando e como fazer.