Coesão em ciência da computação é a relação de quão fortemente relacionadas e objetivas são as responsabilidades de uma classe.
Problema: Como manter os objetos bem focados, inteligíveis, gerenciavéis e como efeito colateral apoiar o baixo acoplamento?
Solução: Atribuir uma responsabilidade de forma que a coesão permaneça alta.
Em outras palavras, são classes de difícil entendimento e manutenção consequentemente de difícil reutilização, executam atividades que deveriam ser delegadas para outros objetos, ou apresentam um nível de abstração alto.
Para exemplificar vou apresentar uma situação fictícia, de um sistema de atendimento de chamados, e esses atendimentos podem esta relacionados a vários clientes.

Considere a seguinte situação, o usuário adiciona um cliente ao atendimento. O ControladorAtendimento recebe a mensagem, seguindo o princípio criador, ela detêm os dados iniciais de Cliente e se torna uma boa candidata para criar a instância c do Cliente.
Depois a instância ControladorAtendimento envia uma mensagem AdicionarCliente passando a instância c Cliente para o Atendimento.
Nesse caso de forma isolado, não há problemas de coesão, porem se o Controlador continuar a ser responsável pela maioria dos serviços executados pelo gerenciamento de um atendimento ele irá se sobrecarregar de tarefas e perderá sua coesão.
O digrama abaixo apresenta a solução para o problema citado:

O ControladorAtendimento delega para o objeto Atendimento a função de criar a instancia de Cliente.
Dessa forma tornamos a classe Atendimento mais coesa, pois suas atividades estão mais encapsuladas.
Se analisarmos melhor, o princípio criador esta sendo mais bem aplicado nesse caso, pois Atendimento “contém” uma lista Cliente e Atendimento usa Cliente de maneira muito próxima, ou seja, são duas condições que a tonam uma candidata a criação instância Cliente muito melhor que ControladorAtendimento.
Outro princípio que podemos identificar que foi aplicado nessa solução foi a diminuição do acoplamento da classe ControladorAtendimento, pois ela não precisa mais ter conhecimento (ou referência) para do objeto Cliente.
Segundo Grandy Booch, coesão alta existe quando os elementos de um componente “trabalham juntos para fornecer algum comportamento bem delimitado”.
Craig Larman define uma classe com coesão alta da como, “tem um número relativamente pequeno de métodos, com funcionalidade altamente relacionada, e não executa muito trabalho. Se a tarefa for grande, irá colaborar com outros objetos para dividir o esforço”.
Graus de Coesão
1. Coesão Muito Baixa – Uma classe é a única responsável por muitas coisas em áreas funcionais muito diferentes.
2. Coesão Baixa – Uma classe é a única responsável por uma tarefa complexa em uma área funcional.
3. Coesão Alta – Uma classe que tem responsabilidades moderadas em uma área funcional e colabora com outras classes para realizar a tarefa.
4. Coesão Moderada – Uma classe tem peso leve e responsabilidade exclusivas em algumas áreas logicamente relacionadas ao conceito da classe, mas não umas com as outras.
Conclusão
Assim como o Baixo Acoplamento, Coesão Alta é um princípio que devemos ter em mente durante todo o desenvolvimento/projeto de um sistema, pois auxilia a avaliação de alternativas e de tomada de decisão sobre os objetos de software.
