觀察者模式是一種行為模式,它定義了物件之間的一對多依賴關係,以便當一個物件更改狀態時,它的所有依賴項都會收到通知並自動更新。
物件改變狀態稱為Subject,其依賴者稱為Observers。
當您需要物件之間存在一對多依賴關係時,可以使用觀察者模式,其中一個物件會變更其狀態,並且許多依賴物件需要追蹤這些變更。
假設我們使用像X(Twitter)這樣的SNS,公司和人們都有自己的帳戶,人們可以關注他們最喜歡的公司,以便在公司發布有關新商品或促銷商品時收到通知。在這種情況下,觀察者模式就適用。
I公司介面:
public interface ICompany { void registerAccount(IAccount account); void removeAccount(IAccount account); void notifyAccounts(); }
公司類別:
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(); } }
IAaccount介面:
public interface IAccount { void update(Company company); }
帳戶類別:
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()); } }
客戶端類別:
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"); } }
輸出:
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
您可以在這裡查看所有設計模式的實作。
GitHub 儲存庫
附註
我是剛開始寫科技博客,如果您對我的寫作有什麼建議,或者有任何困惑的地方,請留言!
感謝您的閱讀:)
以上是觀察者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!