Maison >Java >javaDidacticiel >Modèle d'observateur

Modèle d'observateur

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 23:41:31383parcourir

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();
}

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();
    }
}

Interface IAccount :

public interface IAccount {

    void update(Company company);
}

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());
    }
}

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");
    }
}

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

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!

Déclaration:
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