Mesmo assim, muitas classes que aparentemente não guardam relação entre si podem precisar conhecer mudanças de estado umas das outras. Tal situação é alvo do Design Pattern comportamental Observer. Nele, uma classe expõe uma espécie de serviço por assinatura relativo a uma determinada característica sua. Outros objetos, então, podem assinar o serviço para serem notificados sempre que essa característica sofrer uma manutenção relevante – quando ela for alterada ou acessada, por exemplo.
Um cenário onde esse padrão pode ser aplicado ocorre quando há uma classe representando uma massa de dados que é acessível por diversas outras classes. É o caso das planilhas de cálculo, onde os mesmos dados podem ser exibidos numa tabela ou num gráfico ou ainda servirem de base para cálculos apresentados em outras tabelas. É interessante, portanto, que essas classes sejam notificadas toda vez que houver uma alteração na massa de dados, pois assim elas poderão refletir imediatamente quaisquer alterações e sempre apresentar informações atualizadas para o usuário. Não é à toa que a descrição acima remeta tão fortemente ao conceito de MVC (Model-View-Controller) : a parte View é tradicionalmente implementada como um Observer.
Outro exemplo de aplicação desse padrão é em sistemas com auditoria. Aqui, classes que permitam manutenção em dados podem ser preparadas para prover um serviço que reporte certas alterações. Então, essas alterações podem ser registradas no banco de dados para uma eventual auditoria ou disparar a emissão de alertas a usuários com credenciais especiais que tenham solicitado receber notificações sobre as alterações. O diagrama UML abaixo mostra uma solução para esse cenário usando o Observer.
Note que o padrão é estruturado de forma que a classe com regras de negócio expõe o serviço de notificação mas somente quando surge necessidade (ou por opção do usuário) é que as demais classes fazem a assinatura para receber tais notificações. Isto é, a notificação não é compulsória; ela é feita somente sob demanda da própria classe interessada.
Os participantes de uma solução com esse design pattern recebem os nomes explicados no quadro a seguir:




O padrão Observer é dos mais utilizados, tanto que alguns frameworks, como Java e .Net, já trazem embutidos mecanismos para agilizar sua implementação. Isso se dá através da introdução de interfaces (com nomes como IObserver e IObservable) ou de palavras chaves da própria linguagem de programação (delegate e event). A VCL também usa o Observer em vários pontos, principalmente no tratamento de eventos de seus componentes.
No próximo post, apresento uma implementação desse exemplo usando Delphi.
Um comentário :
Eu desenvolvo em Delphi e achei este site por acaso. Luis Gustavo muito obrigado por seu serviço caprichado. Seus artigos são muito bem explicados e cheios de exemplos práticos. Nota dez!
Postar um comentário
OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.
Observação: somente um membro deste blog pode postar um comentário.