Eu pelo menos faço assim: no controller, eu tenho alguma coleção (ou uma única entidade) do model e um objeto do view. Sempre que você faz algo no view(interface do programa), o controller recebe a requisição, faz o processamento usando os dados do model e envia o resultado pro view exibir.
Em um único programa, você pode ter várias dessas triades (model, controller e view de funcionário, aula, universidade, e aluno, por exemplo, em um sistema para uma universidade). Isso daria pelo menos 12 classes. Para a comunicação dos dados de funcionario e aula, os controllers das duas deveriam se comunicar para transmitir os dados.
A comunicação quase sempre ocorre entre os controles (com várias exceções) e só os controle tem os seus models e views (com várias exceções também :)). Usando o exemplo de antes: no model universidade, você poderia ter como atributo uma coleção do model de funcionario, aula e aluno (uma universidade tem vários professores, aulas e alunos). No model de aula, teria uma coleção de aluno e um professor (uma aula tem vários alunos e um professor). Mas aluno e professor não teriam nenhuma coleção dentro deles.
Não sei se esse é o jeito correto ou não, mas tem funcionado muito bem pra mim 
Mas pergunta para aquele Leonardo3001. Já que ele disse que todos responderam errado, e ele certo, ele deve ser o cara! Se continuar com duvidas, me passa seu e-mail que eu mando algo que eu já tenho feito esplicando a minha idéia sobre esse assunto.