O Padrão Observer : Abordagem Simples para Reactividade

Ildeberto Vasconcelos
2 min readJan 4, 2024

--

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.

Uma Criança ( Observador ) atenta ao micrrondas(Observavél) ,tão logo o microondas mude de estado o obsercvdor saberá pois será emitida uma notificação ( aquele som do microondas).

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.

--

--

Ildeberto Vasconcelos
Ildeberto Vasconcelos

Written by Ildeberto Vasconcelos

📱Flutter & Dart 🚀💻 Turning ideas into powerful applications.💡🔥 #Flutter | .NET

No responses yet