Heim > Java > javaLernprogramm > Beobachtermuster

Beobachtermuster

Patricia Arquette
Freigeben: 2024-11-03 23:41:31
Original
383 Leute haben es durchsucht

Was ist ein Beobachtermuster?

Beobachtermuster ist ein Verhaltensmuster, das eine Eins-zu-viele-Abhängigkeit zwischen Objekten definiert, sodass alle abhängigen Objekte automatisch benachrichtigt und aktualisiert werden, wenn sich ein Objekt ändert.

Das Objekt, das seinen Zustand ändert, wird Subjekt genannt, und seine abhängigen Objekte werden Beobachter genannt.

Wann sollte man es verwenden?

Sie können das Observer-Muster verwenden, wenn Sie eine Eins-zu-viele-Abhängigkeit zwischen Objekten benötigen, das eine seinen Zustand ändert und die vielen abhängigen Objekte diese Änderungen verfolgen müssen.

Nehmen wir an, wir nutzen SNS wie X (Twitter), Unternehmen und Personen haben ihr eigenes Konto und die Personen können ihrem Lieblingsunternehmen folgen, sodass sie benachrichtigt werden möchten, wenn das Unternehmen einen neuen Artikel oder einen Verkaufsartikel postet. In dieser Situation ist das Observer-Muster anwendbar.

UML-Diagramm

Observer Pattern

Beispiel für ein UML-Diagramm

Observer Pattern

  • Wenn die setSaleItem-Methode aufgerufen wird, d. h. der Status geändert wird, rufen wir die setItemChanged-Methode auf. Anschließend ruft die setItemChanged-Methode die notifyAccount-Methode auf.
  • Die notifyAccount-Methode in der Company-Klasse iteriert jeden Follower und ruft die Update-Methode mit ihrem eigenen Company-Objekt wie follower.update(this) auf.

Implementierung in Java

ICompany-Schnittstelle:

public interface ICompany {

    void registerAccount(IAccount account);

    void removeAccount(IAccount account);

    void notifyAccounts();
}
Nach dem Login kopieren

Unternehmensklasse:

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();
    }
}
Nach dem Login kopieren

IAccount-Schnittstelle:

public interface IAccount {

    void update(Company company);
}
Nach dem Login kopieren

Kontoklasse:

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());
    }
}
Nach dem Login kopieren

Client-Klasse:

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");
    }
}
Nach dem Login kopieren

Ausgabe:

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
Nach dem Login kopieren

Sie können alle Entwurfsmusterimplementierungen hier überprüfen.
GitHub-Repository


P.S.
Ich bin neu im Schreiben von Tech-Blogs. Wenn Sie Ratschläge zur Verbesserung meines Schreibens haben oder einen verwirrenden Punkt haben, hinterlassen Sie bitte einen Kommentar!
Vielen Dank fürs Lesen :)

Das obige ist der detaillierte Inhalt vonBeobachtermuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage