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.
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.
ICompany-Schnittstelle:
public interface ICompany { void registerAccount(IAccount account); void removeAccount(IAccount account); void notifyAccounts(); }
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(); } }
IAccount-Schnittstelle:
public interface IAccount { void update(Company company); }
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()); } }
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"); } }
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
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!