O Padrão Observer : Abordagem Simples para Reactividade
O padrão Observer é um dos pilares fundamentais da programação orientada a objetos. Ele permite que um objeto, chamado de “observável”, notifique outros objetos, os “observadores”, sobre qualquer alteração no seu proprio estado. Essa notificação permite que os observadores reajam e atualizem seu estado.
Basicamente, um observador se inscreve para observar mudanças em um observável e é notificado sempre que essa mudança ocorre.
Vantagens do Padrão Observer:
- Desacoplamento: Observadores são desacoplados do observável, permitindo mudanças no observável sem afetar diretamente os observadores.
- Facilidade de Escala: Novos observadores podem ser adicionados facilmente, estendendo as funcionalidades sem modificar o observável.
- Reactividade : Os observadores são notificados instantaneamente sobre mudanças, possibilitando reações em tempo real.
Quando Utilizar o Padrão Observer?
O padrão Observer é útil em situações em que mudanças em um objeto/variavel precisam ser refletidas em outros objetos sem criar dependências diretas entre eles. É ideal quando se deseja atualizar automaticamente múltiplos elementos da interface de usuário, notificar eventos ou espalhar mudanças de estado
Exemplo de Implementação em Flutter/Dart:
No Flutter, podemos utilizar o padrão Observer para atualizar a interface de usuário quando o estado de um objeto muda. Lá vai uma aplicação de lista de tarefas,que pode ser rapidamente testada no DartPad
// Definição do Observável
class ListaDeTarefas {
List<String> _tarefas = [];
List<Function> _observadores = [];
void adicionarTarefa(String novaTarefa) {
_tarefas.add(novaTarefa);
notificarObservadores();
}
void registrarObservador(Function observador) {
_observadores.add(observador);
}
void notificarObservadores() {
for (var observador in _observadores) {
observador();
}
}
}
Como vimos antes,são dois componentes a actuar,nesse primeiro trecho acima definimos o componente Observável
vejamos agora o Observador
// Implementação do Observador
class InterfaceUsuario {
ListaDeTarefas lista;
InterfaceUsuario(this.lista) {
lista.registrarObservador(atualizar);
}
void atualizar() {
// Atualiza a interface de acordo com as mudanças na lista de tarefas
print("Lista de tarefas atualizada: ${lista._tarefas}");
}
}
Desse jeito partimos para o uso:
void main() {
ListaDeTarefas lista = ListaDeTarefas();
InterfaceUsuario interfaceUsuario = InterfaceUsuario(lista);
lista.adicionarTarefa("Tarefa Nº 1");
}
Neste exemplo, a classe ListaDeTarefas
é o observável e a classe InterfaceUsuario
é o observador. Quando uma nova tarefa é adicionada à lista, a interface do usuário é automaticamente atualizada através do método atualizar()
.
e para quem já codifica com flutter,deve se lembrar de packages como Provider ou mesmo o ChangeNotifier nativo do flutter ,que utiliza esta técnica para gestão de estados das aplicações.