Camada de Abstração e Nível de Indirecionamento são conceitos distintos. Abstração é a agregação e nomeação significativa de vários elementos, como pedaços de dados ou instruções de programas, por exemplo, o conceito de um arquivo ou chamada de método, enquanto a indireção é o desacoplamento de entidades para facilitar o adiamento da realização de seu relacionamento, por exemplo, o uso de JNDI para separar a identificação de um recurso dentro de um programa do recurso real que pode eventualmente ser fornecido por um contêiner de aplicativo.
Frequentemente, os conceitos andam de mãos dadas e o que se aplica a um constructo particular depende de qual exercício ou discussão está em andamento. Por exemplo, a natureza abstrata de uma interface é importante ao aprender ou documentar uma API; sua propriedade de indirecção é importante ao adicionar extensibilidade ou criar testes para um aplicativo.
Uma camada de abstração é a agregação de abstrações e dando-lhes uma integridade conceitual e consistência de uso. CreateProcess é o nome da API do win32 para um monte de código que cria e executa um processo. O "nome" é significativo para este contexto, porque se chamarmos a função de algo como DoAllocMemThenMakeEnvThenFindEntryPoint ... realmente não seria muito abstrato. Uma camada como a API do Win32 fornece uma barreira na qual um programador pode ser avisado para não se aventurar. Ele elimina a complexidade do ponto de vista do chamador ao custo de potência reduzida (flexibilidade, desempenho, etc.). Esse trade-off é destacado pela discussão freqüente de abstrações gotejantes: ainda podemos precisar fazer chamadas SQL diretas ao usar o Hibernate ou fazer chamadas do Win32 ao usar o .NET.
Em relação à indireção indireta, a maioria dos programas não-triviais opera com alguma forma de indireção codificada pelo usuário, veja a seção INPUT-OUTPUT do COBOL antes da arca. Ao acessar um recurso como um banco de dados, podemos ver a incorporação de uma cadeia de conexão JDBC no código como Indireta de nível 0, uma conexão JNDI (que delega a escolha do recurso a um contêiner de aplicativo) como Nível 1 e alguma construção de Spring que mapeia o identificador JNDI do aplicativo para um dos muitos recursos de contêiner como Nível 2. Vários níveis permitem que um número de partes externas ao relacionamento (nesse caso, um relacionamento entre a execução de código e um banco de dados) manipule esse relacionamento. Isso se aplica igualmente aos componentes internos do programa, como interfaces e eventos.
Vemos que, não importa quais sejam suas outras qualidades, a abstração reduz a complexidade, enquanto a indireta a aumenta. A abstração reduz o poder, enquanto a indireta aumenta. O Indirection pode ser usado para restaurar o poder de abstração, permitindo que o comportamento padrão seja substituído por retornos de chamada personalizados.