Maison > Java > javaDidacticiel > le corps du texte

Modèle d'observateur

Patricia Arquette
Libérer: 2024-11-03 23:41:31
original
337 Les gens l'ont consulté

Qu’est-ce que le modèle d’observateur ?

Le modèle d'observateur est un modèle comportemental qui définit une dépendance un-à-plusieurs entre les objets de sorte que lorsqu'un objet change d'état, toutes ses dépendances sont notifiées et mises à jour automatiquement.

L'objet change d'état est appelé Sujet, et ses dépendants sont appelés Observateurs.

Quand l'utiliser ?

Vous pouvez utiliser le modèle Observer lorsque vous avez besoin d'une dépendance un-à-plusieurs entre des objets, celui-ci changera d'état et les nombreux dépendants doivent suivre ces changements.

Supposons que nous utilisons SNS comme X (Twitter), que les entreprises et les personnes aient leur propre compte, et que les gens puissent suivre leur entreprise préférée afin de vouloir être avertis lorsque l'entreprise publie un nouvel article ou un article en vente. Dans cette situation, le modèle Observer est applicable.

Diagramme UML

Observer Pattern

Exemple de diagramme UML

Observer Pattern

  • Lorsque la méthode setSaleItem est appelée, c'est-à-dire que l'état est modifié, nous appelons la méthode setItemChanged. Ensuite, la méthode setItemChanged appelle la méthode notifyAccount.
  • La méthode notifyAccount dans la classe Company itère chaque suiveur et appelle la méthode de mise à jour avec son propre objet Company tel que follower.update(this)

Implémentation en Java

Interface ICompany :

public interface ICompany {

    void registerAccount(IAccount account);

    void removeAccount(IAccount account);

    void notifyAccounts();
}
Copier après la connexion

Classe d'entreprise :

import java.util.ArrayList;
import java.util.List;

public class Company implements ICompany {

    private List<IAccount> followers;

    private String name;

    private String saleItem;

    public Company(String name) {
        followers = new ArrayList<>();
        this.name = name;
    }

    @Override
    public void registerAccount(IAccount account) {
        this.followers.add(account);
    }

    @Override
    public void removeAccount(IAccount account) {
        this.followers.remove(account);
    }

    @Override
    public void notifyAccounts() {
        for (IAccount follower : followers) {
            follower.update(this);
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSaleItem() {
        return saleItem;
    }

    public void setSaleItem(String saleItem) {
        this.saleItem = saleItem;
        saleItemChanged();
    }

    public void saleItemChanged() {
        notifyAccounts();
    }
}
Copier après la connexion

Interface IAccount :

public interface IAccount {

    void update(Company company);
}
Copier après la connexion

Classe de compte :

public class Account implements IAccount {

    private String name;

    public Account(String name) {
        this.name = name;
    }

    @Override
    public void update(Company company) {
        System.out.println(this.name + " receives a new message from " + company.getName());
        System.out.println("New sale item: " + company.getSaleItem());
    }
}
Copier après la connexion

Classe client :

public class Client {

    public static void main(String[] args) {
        Company apple = new Company("Apple"); // concrete subject

        IAccount john = new Account("John");
        IAccount david = new Account("David");

        // John starts following Apple Inc.
        apple.registerAccount(john);
        apple.setSaleItem("iPhone 14");
        System.out.println("**********************");

        // David becomes a new follower to Apple Inc.
        apple.registerAccount(david);
        apple.setSaleItem("iPad");
        System.out.println("**********************");

        // John doesn't receive message from Apple Inc. as he deregistered for Apple Inc.
        apple.removeAccount(john);
        apple.setSaleItem("AirPods");
    }
}
Copier après la connexion

Sortie :

John receives a new message from Apple
New sale item: iPhone 14
**********************
John receives a new message from Apple
New sale item: iPad
David receives a new message from Apple
New sale item: iPad
**********************
David receives a new message from Apple
New sale item: AirPods
Copier après la connexion

Vous pouvez consulter toutes les implémentations de modèles de conception ici.
Dépôt GitHub


P.S.
Je suis nouveau dans l'écriture d'un blog technique, si vous avez des conseils pour améliorer mon écriture ou si vous avez un point déroutant, veuillez laisser un commentaire !
Merci d'avoir lu :)

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!

source:dev.to
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal