Menu
Coddy logo textTech

Patron Observateur

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 92 sur 110.

Le patron Observateur établit une relation de un à plusieurs entre les objets : lorsqu'un objet (le sujet) change d'état, tous ses dépendants (observateurs) sont automatiquement notifiés. C'est parfait pour des scénarios tels que les mises à jour de l'interface utilisateur, les systèmes d'événements ou toute situation où plusieurs parties de votre application doivent réagir aux changements.

Le patron implique deux rôles clés : un Subject qui maintient une liste d'observateurs et les informe des changements, et des Observers qui s'enregistrent eux-mêmes et répondent aux mises à jour :

abstract class Observer {
  void update(String message);
}

class NewsAgency {
  final List<Observer> _observers = [];
  String _latestNews = '';

  void subscribe(Observer observer) {
    _observers.add(observer);
  }

  void unsubscribe(Observer observer) {
    _observers.remove(observer);
  }

  void publishNews(String news) {
    _latestNews = news;
    for (var observer in _observers) {
      observer.update(_latestNews);
    }
  }
}

class NewsChannel implements Observer {
  final String name;
  NewsChannel(this.name);

  @override
  void update(String message) {
    print('$name received: $message');
  }
}

void main() {
  var agency = NewsAgency();
  var cnn = NewsChannel('CNN');
  var bbc = NewsChannel('BBC');

  agency.subscribe(cnn);
  agency.subscribe(bbc);

  agency.publishNews('Breaking news!');
  // CNN a reçu : Breaking news!
  // BBC a reçu : Breaking news!
}

Lorsque publishNews est appelée, l'agence parcourt tous les observateurs abonnés et appelle leur méthode update. Les observateurs peuvent s'abonner ou se désabonner à tout moment, ce qui rend le système flexible et faiblement couplé - le sujet n'a pas besoin de connaître les types spécifiques de ses observateurs.

challenge icon

Défi

Facile

Construisons un système d'alerte de prix d'actions en utilisant le pattern Observer ! Vous allez créer un système où un téléscripteur d'actions (stock ticker) informe plusieurs investisseurs chaque fois que le prix change, permettant à chaque investisseur de réagir aux mises à jour du marché à sa manière.

Vous organiserez votre code en deux fichiers :

  • stock_system.dart : Créez votre système d'observateur ici :
    • Une classe abstraite Investor avec une méthode void onPriceChange(String stockName, double price)
    • Une classe DayTrader qui implémente Investor. Elle possède un champ name et sa méthode onPriceChange affiche : [name] sees [stockName] at $[price] - Making quick trade!
    • Une classe LongTermInvestor qui implémente Investor. Elle possède un champ name et sa méthode onPriceChange affiche : [name] notes [stockName] at $[price] - Holding steady.
    • Une classe StockTicker (le sujet) avec :
      • Un champ String stockName
      • Une liste privée pour stocker les investisseurs abonnés
      • Une méthode subscribe(Investor investor) pour ajouter un investisseur
      • Une méthode unsubscribe(Investor investor) pour supprimer un investisseur
      • Une méthode updatePrice(double newPrice) qui notifie tous les investisseurs abonnés du nouveau prix
  • main.dart : Importez votre système d'actions et démontrez le pattern Observer en action :
    • Créez un StockTicker pour une action nommée DART
    • Créez un DayTrader nommé Alice et un LongTermInvestor nommé Bob
    • Abonnez les deux investisseurs au téléscripteur
    • Mettez à jour le prix à 150.50 (les deux investisseurs doivent être notifiés)
    • Affichez une ligne vide
    • Désabonnez Alice du téléscripteur
    • Mettez à jour le prix à 155.75 (seul Bob doit être notifié maintenant)

Cela démontre comment le pattern Observer crée un système lâchement couplé - le StockTicker n'a pas besoin de savoir s'il notifie des traders de jour ou des investisseurs à long terme, il appelle simplement onPriceChange sur quiconque est abonné !

Sortie attendue :

Alice sees DART at $150.5 - Making quick trade!
Bob notes DART at $150.5 - Holding steady.

Bob notes DART at $155.75 - Holding steady.

Essayez vous-même

import 'stock_system.dart';

void main() {
  // TODO: Créer un StockTicker pour une action nommée 'DART'
  
  // TODO: Créer un DayTrader nommé 'Alice'
  
  // TODO: Créer un LongTermInvestor nommé 'Bob'
  
  // TODO: Abonner les deux investisseurs au ticker
  
  // TODO: Mettre à jour le prix à 150.50 (les deux investisseurs doivent être notifiés)
  
  // TODO: Afficher une ligne vide
  
  // TODO: Désabonner Alice du ticker
  
  // TODO: Mettre à jour le prix à 155.75 (seul Bob doit être notifié maintenant)
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Dart en ligne