首頁 >Java >java教程 >觀察者模式

觀察者模式

Patricia Arquette
Patricia Arquette原創
2024-11-03 23:41:31399瀏覽

什麼是觀察者模式?

觀察者模式是一種行為模式,它定義了物件之間的一對多依賴關係,以便當一個物件更改狀態時,它的所有依賴項都會收到通知並自動更新。

物件改變狀態稱為Subject,其依賴者稱為Observers

什麼時候使用它?

當您需要物件之間存在一對多依賴關係時,可以使用觀察者模式,其中一個物件會變更其狀態,並且許多依賴物件需要追蹤這些變更。

假設我們使用像X(Twitter)這樣的SNS,公司和人們都有自己的帳戶,人們可以關注他們最喜歡的公司,以便在公司發布有關新商品或促銷商品時收到通知。在這種情況下,觀察者模式就適用。

UML圖

Observer Pattern

UML 圖表範例

Observer Pattern

  • 當呼叫setSaleItem方法時,即狀態改變時,我們呼叫setItemChanged方法。然後,setItemChanged方法呼叫notifyAccount方法。
  • Company 類別中的notifyAccount 方法迭代每個追蹤者並使用自己的Company 物件呼叫更新方法,例如follower.update(this)

Java 中的實作

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn