Menu
Coddy logo textTech

Patron Observer

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 modèle implique deux rôles clés : un Sujet qui tient à jour une liste d’observateurs et les informe des changements, ainsi que des Observateurs qui s’inscrivent et réagissent 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 du cours des actions à l’aide du modèle Observateur ! Tu vas créer un système dans lequel un ticker boursier informe plusieurs investisseurs chaque fois que le cours change, permettant à chaque investisseur de réagir aux évolutions du marché à sa manière.

Tu organiseras ton code en deux fichiers :

  • stock_system.dart : crée ton système d’observation 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 informe tous les investisseurs abonnés du nouveau cours
  • main.dart : importe ton système boursier et montre le modèle Observateur en action :
    • Crée un StockTicker pour une action nommée DART
    • Crée un DayTrader nommé Alice et un LongTermInvestor nommé Bob
    • Abonne les deux investisseurs au ticker
    • Mets le cours à jour avec 150.50 (les deux investisseurs doivent être informés)
    • Affiche une ligne vide
    • Désabonne Alice du ticker
    • Mets le cours à jour avec 155.75 (seul Bob doit maintenant être informé)

Cela montre comment le modèle Observateur crée un système faiblement couplé : le StockTicker n’a pas besoin de savoir s’il informe des day traders ou des investisseurs à long terme ; il appelle simplement onPriceChange sur toute personne qui est abonnée !

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