É o mesmo que o 'ViewModel' do padrão de design do Model-View-ViewModel (MVVM)
Não.
Isso seria o seguinte :
Isso tem ciclos. O tio Bob tem evitado cuidadosamente os ciclos .
Em vez disso, você tem o seguinte:
O que certamente não tem ciclos. Mas está deixando você se perguntando como a exibição sabe sobre uma atualização. Chegaremos a isso em um momento.
ou é um simples objeto de transferência de dados (DTO)?
Para citar Bob da página anterior:
Você pode usar estruturas básicas ou objetos simples de transferência de dados, se quiser. Ou você pode empacotá-lo em um hashmap ou construí-lo em um objeto.
Arquitetura Limpa p207
Então, claro, se você quiser.
Mas eu suspeito fortemente o que realmente está incomodando você é o seguinte :
Esse pequeno abuso da UML contrasta a direção da dependência do código-fonte com a direção do fluxo de controle. É aqui que a resposta para sua pergunta pode ser encontrada.
Em um relacionamento de uso:
o fluxo de controle segue na mesma direção que a dependência do código fonte.
Em um relacionamento de implementação:
o fluxo de controle normalmente segue na direção oposta à da dependência do código-fonte.
O que significa que você está realmente olhando para isso:
Você deve conseguir ver que o fluxo de controle nunca vai passar do Apresentador para a Visualização.
Como pode ser? O que isso significa?
Isso significa que a visualização possui seu próprio encadeamento (o que não é incomum) ou (como o @Euphoric aponta) o fluxo de controle está entrando na visualização de algo mais não descrito aqui.
Se for o mesmo thread, o View saberá quando o View-Model está pronto para ser lido. Mas, se esse for o caso, e a visualização for uma GUI, será difícil repintar a tela quando o usuário a mover enquanto espera pelo banco de dados.
Se a visualização tiver seu próprio encadeamento, ele terá seu próprio fluxo de controle. Isso significa que, para implementar isso, o View precisará pesquisar o View-Model para observar as alterações.
Como o apresentador não sabe que a exibição existe e a exibição não sabe que o apresentador existe, eles não podem se ligar. Eles não podem arremessar eventos um para o outro. Tudo o que pode acontecer é que o Presenter gravará no View-Model e o View lerá o View-Model. Sempre que lhe apetecer.
De acordo com este diagrama, a única coisa que o View e o Presenter compartilham é o conhecimento do View-Model. E é apenas uma estrutura de dados. Portanto, não espere que ele tenha algum comportamento.
Isso pode parecer impossível, mas pode funcionar mesmo que o View-Model seja complexo. Um pequeno campo atualizado é tudo o que a visualização teria que pesquisar para detectar uma alteração.
Agora, é claro, você pode insistir em usar o padrão de observador ou ter alguma coisa estruturada para esconder esse problema, mas entenda que não precisa.
Aqui está um pouco de diversão que ilustrei o fluxo de controle:
Observe que sempre que você vê o fluxo indo contra as direções definidas anteriormente, o que você vê é uma chamada retornando. Esse truque não nos ajudará a chegar ao ponto de vista. Bem, a menos que voltemos ao que chamamos de Controller. Ou você pode simplesmente mudar o design para poder acessar a visualização. Isso também corrige o que parece ser o início de um problema de ioiô com o Data Access e sua interface.
A única outra coisa a aprender aqui, além disso, é que o Use Case Interactor pode praticamente chamar as coisas na ordem que quiser, desde que o último seja o apresentador.