Table des matières
1. Utilisation de l'héritage Observable et Observer (non recommandé)
2. Approche moderne: modèle d'observateur personnalisé (recommandé)
Étape 1: Définissez l'interface de l'observateur
Étape 2: implémenter le sujet
Étape 3: Utilisez-le avec des expressions de lambda
3. Alternative: Utilisation PropertyChangeListener (pour GUI ou des objets en forme de haricot)
Résumé
Maison Java javaDidacticiel Comment utiliser le modèle d'observateur en Java?

Comment utiliser le modèle d'observateur en Java?

Aug 02, 2025 am 11:52 AM
java Mode observateur

La réponse claire à cette question est la recommandation d'implémenter le modèle d'observateur à l'aide d'une interface d'observateur personnalisée. 1. Bien que Java offre observable et observateur, le premier est une classe et a été obsolète et manque de flexibilité; 2. La pratique recommandée moderne consiste à définir une interface d'observateur fonctionnel , qui maintient la liste des observateurs par sujet et avertit tous les observateurs lorsque l'État change; 3. Il peut être utilisé en combinaison avec les expressions de lambda pour améliorer la simplicité et la maintenabilité du code; 4. Pour les scénarios GUI ou Javabean, PropertyChangeListener peut être utilisé. Par conséquent, les nouveaux projets devraient adopter un schéma d'interface d'observateur personnalisé, qui est en sécurité, facile à tester et bien compatible avec les fonctionnalités Java modernes.

Comment utiliser le modèle d'observateur en Java?

Le modèle d'observateur en Java est un modèle de conception comportemental où un objet (appelé le sujet ) maintient une liste de personnes à charge (appelées observateurs ) qui sont notifiées automatiquement lorsque le sujet change l'état. Java fournit une prise en charge intégrée pour ce modèle via la classe java.util.Observable et l'interface java.util.Observer - bien qu'elles soient obsolètes depuis Java 9 , les comprendre aide à saisir le concept. Nous couvrirons à la fois l'approche héritée et la manière moderne et recommandée en utilisant des interfaces personnalisées ou une programmation fonctionnelle.

Comment utiliser le modèle d'observateur en Java?

1. Utilisation de l'héritage Observable et Observer (non recommandé)

Même s'il est obsolète, voici comment cela fonctionnait auparavant:

 import java.util.observable;
import java.util.observer;

// Sujet (source de données)
La série de la classe s'étend observable {
    température flottante privée;

    métier de vide public (température du flotteur) {
        this.temperature = température;
        setChanged (); // doit appeler cela avant de notifier
        notifyObservers (température); // Envoyez la mise à jour
    }

    public float getTemperature () {
        température de retour;
    }
}

// Observer (abonné)
L'affichage de classe implémente l'observateur {
    nom de chaîne privé;

    affichage public (nom de chaîne) {
        this.name = name;
    }

    @Outrepasser
    Mise à jour du public (observable observable, objet arg) {
        if (instance observable de Weatherstation) {
            float temp = (float) arg;
            System.out.println (nom "Affichage: température mise à jour vers" temp "° C");
        }
    }
}

// utilisation
classe publique ObserverDemo {
    public static void main (String [] args) {
        Station de Weatherstation = New Weatherstation ();
        Affichage phonedisplay = nouveau affichage ("téléphone");
        Affichage tvDisplay = nouveau affichage ("TV");

        Station.AddObserver (PhoneDisplay);
        Station.AddObserver (TVDisplay);

        Station.SetTemperature (25,5f); // déclenche des notifications
        Station.SetTemperature (30.0f);
    }
}

⚠️ Remarque : Observable est une classe, pas une interface, vous ne pouvez donc pas l'utiliser avec un héritage multiple. C'est une des raisons pour lesquelles elle a été obsolète.

Comment utiliser le modèle d'observateur en Java?

2. Approche moderne: modèle d'observateur personnalisé (recommandé)

Au lieu de s'appuyer sur des classes intégrées, définissez votre propre contrat d'observateur sujet à l'aide d'interfaces.

Étape 1: Définissez l'interface de l'observateur

 @FunctionalInterface
Observer d&#39;interface publique <T> {
    VOID UPDATE (T DONNÉES);
}

Étape 2: implémenter le sujet

 import java.util.arraylist;
Importer java.util.list;

classe publique Weatherstation {
    Liste privée <Observer <fload >> Observateurs = new ArrayList <> ();
    température flottante privée;

    public void addObserver (Observer <fload> Observer) {
        observateurs.add (observateur);
    }

    public void retireobserver (Observer <fload> Observer) {
        observateurs.remove (observateur);
    }

    métier de vide public (température du flotteur) {
        this.temperature = température;
        notifyObservers ();
    }

    private void notifyObservers () {
        pour (observateur <fload> observateur: observateurs) {
            Observer.Update (température);
        }
    }

    public float getTemperature () {
        température de retour;
    }
}

Étape 3: Utilisez-le avec des expressions de lambda

 classe publique ModernObserverDemo {
    public static void main (String [] args) {
        Station de Weatherstation = New Weatherstation ();

        // ajouter des observateurs à l&#39;aide de lambdas
        Station.AddObserver (temp -> System.out.println ("Affichage du téléphone:" Temp "° C"));
        Station.AddObserver (temp -> System.out.println ("Affichage TV:" Temp "° C"));
        Station.AddObserver (temp -> {
            if (temp> 28) {
                System.out.println ("Alerte: haute température détectée!");
            }
        });

        // Changer l&#39;état
        Station.SetTemperature (25.0f);
        Station.SetTemperature (29,5F);
    }
}

Sortir:

Comment utiliser le modèle d'observateur en Java?
 Affichage du téléphone: 25,0 ° C
Affichage du téléviseur: 25,0 ° C
Affichage du téléphone: 29,5 ° C
Affichage du téléviseur: 29,5 ° C
Alerte: température élevée détectée!

Cette approche est:

  • Plus flexible (utilise des interfaces, pas des classes de béton)
  • Prend en charge les expressions de lambda
  • Plus facile à tester et à étendre
  • Non lié aux API obsolètes

3. Alternative: Utilisation PropertyChangeListener (pour GUI ou des objets en forme de haricot)

Java a également java.beans.PropertyChangeListener , qui n'est toujours pas obsolète et utile dans certains contextes (comme Swing ou Pojos avec des événements de changement de propriété).

 Importer java.beans.propertychangeListener;
Importer java.beans.propertyChangeSupport;

classe publique SmartThermostat {
    Private Final PropertyChangeSupport Support = new PropertyChangeSupport (this);
    INT privé TargetTemp;

    public void addPropertyChangeListener (PropertyChangeListener Écouteur) {
        support.addpropertychangeListener (auditeur);
    }

    public void SettargetTemp (int NewTemp) {
        int old = this.targetTemp;
        this.targetTemp = newTemp;
        Support.FireProperTyChange ("TargetTemp", Old, NewTemp);
    }
}

Utile lorsque vous souhaitez suivre la propriété a changé et ses valeurs anciennes / nouvelles.


Résumé

Approche Statut Cas d'utilisation
Observable / Observer ❌ déprécié Code hérité uniquement
Interface d'observateur personnalisé ✅ Recommandé But général, propre, moderne
PropertyChangeListener ✅ Disponible Applications GUI, propriétés de haricots

Pour de nouveaux projets, optez pour une interface d'observateur personnalisée - c'est simple, en sécurité de type et fonctionne bien avec les lambdas.

Fondamentalement, juste:

  • Définir une interface Observer<t></t>
  • Maintenir une liste d'auditeurs dans votre sujet
  • Les informer sur le changement d'état

C'est le modèle d'observateur bien fait dans Java moderne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1525
276
Correction: Ethernet 'réseau non identifié' Correction: Ethernet 'réseau non identifié' Aug 12, 2025 pm 01:53 PM

RestartyourRouterAndComputerToresolvetemporaryGlithes.2.RunthenetWorkTrouleshooTerviATheSystemTraytomAticalMatterFixComMonissues.3.RenewtheipAddressusingcomandPomptSADMinistratorByrunningIpConfig / Release, Ipconfig / Renew, NetShwinsockReset, etnetSh

Comment utiliser l'API HTTPClient en Java Comment utiliser l'API HTTPClient en Java Aug 12, 2025 pm 02:27 PM

Le cœur de l'utilisation du javahttpclientapi est de créer un httpclient, de créer un httprequest et de traiter httpResponse. 1. Utilisez httpclient.newhttpclient () ou httpclient.newbuilder () pour configurer les délais d'expiration, proxy, etc. pour créer des clients; 2. Utilisez httpRequest.newBuilder () pour définir URI, méthode, en-tête et corps pour construire des demandes; 3. Envoyez des demandes synchrones via client.send () ou envoyez des demandes asynchrones via client.sendaSync (); 4. Utilisez des handleurs.

Excel trouver et remplacer ne fonctionne pas Excel trouver et remplacer ne fonctionne pas Aug 13, 2025 pm 04:49 PM

CheckkSearchSettings like "MatchEnteRireCellContents" et "MatchCase" ByExpandingOptionsInFindanDreplace, garantissant "lookin" issettominuesand »dans" TOCORRECTSCOPE; 2.LOORHFORHIDDENCHARACTER

Qu'est-ce qu'une liste liée en Java? Qu'est-ce qu'une liste liée en Java? Aug 12, 2025 pm 12:14 PM

LinkedList est une liste liée bidirectionnelle dans Java, implémentant la liste et les interfaces de Deque. Il convient aux scénarios où les éléments sont fréquemment insérés et supprimés. Surtout lorsqu'il fonctionne aux deux extrémités de la liste, il a une efficacité élevée, mais les performances d'accès aléatoire sont médiocres et la complexité du temps est O (n). L'insertion et la suppression peuvent atteindre O (1) à des endroits connus. Par conséquent, il convient à la mise en œuvre de piles, de files d'attente ou de situations où les structures doivent être modifiées dynamiquement et ne convient pas aux opérations à forte intensité de lecture qui accèdent fréquemment par index. La conclusion finale est que LinkedList est meilleur que ArrayList lorsqu'il est fréquemment modifié mais a moins d'accès.

The Best Ides for Java Development: une revue comparative The Best Ides for Java Development: une revue comparative Aug 12, 2025 pm 02:55 PM

Thebestjavaidein2024Denpendyourndeds: 1.chooseintellijideaforprofessional, l'entreprise, le development orfulldevelopmentduetoitsSuperiorCodeIntelligence, le framewory

Edge ne sauvant pas l'histoire Edge ne sauvant pas l'histoire Aug 12, 2025 pm 05:20 PM

Tout d'abord, Checkif "ClearbrowsingDataOnClose" IsTurneDOninsettingsandTurnitofftoenSureHistoryissaved.2.Confirmyou'renotusingInprivateMode, asitdoesNotsAvehistoryByDesigr.3.Disable ExtensionStendatoryToUleoutHeleft

Décrivez le modèle de conception de l'observateur et sa mise en œuvre dans PHP. Décrivez le modèle de conception de l'observateur et sa mise en œuvre dans PHP. Aug 15, 2025 pm 01:54 PM

TheObserverdesignpatternenablesautomaticnotificationofdependentobjectswhenasubject'sstatechanges.1)Itdefinesaone-to-manydependencybetweenobjects;2)Thesubjectmaintainsalistofobserversandnotifiesthemviaacommoninterface;3)Observersimplementanupdatemetho

Comment déployer une application Java Comment déployer une application Java Aug 17, 2025 am 12:56 AM

Préparez-vous en application par rapport à Mavenorgradletobuildajarorwarfile, externalisationConfiguration.2.ChoOSEADPLOYENDIRONMENT: Runonbaremetal / vmwithjava-jarandsystemd, deploywarontomcat, compeneriserisewithdocker, orusecloudplatformslikelise.

See all articles