Menu
CoddyTech

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