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.
Défi
FacileConstruisons 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
Investoravec une méthodevoid onPriceChange(String stockName, double price) - Une classe
DayTraderqui implémenteInvestor. Elle possède un champnameet sa méthodeonPriceChangeaffiche :[name] sees [stockName] at $[price] - Making quick trade! - Une classe
LongTermInvestorqui implémenteInvestor. Elle possède un champnameet sa méthodeonPriceChangeaffiche :[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
- Un champ
- Une classe abstraite
main.dart: importe ton système boursier et montre le modèle Observateur en action :- Crée un
StockTickerpour une action nomméeDART - Crée un
DayTradernomméAliceet unLongTermInvestornommé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é)
- Crée un
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)
}
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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne