ホームページ >Java >&#&チュートリアル >オブザーバーパターン

オブザーバーパターン

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 23:41:31399ブラウズ

オブザーバーパターンとは何ですか?

オブザーバー パターンは、オブジェクト間の 1 対多の依存関係を定義する動作パターンです。これにより、1 つのオブジェクトの状態が変化すると、その依存関係すべてが自動的に通知され、更新されます。

オブジェクトの状態変更は サブジェクト と呼ばれ、その依存オブジェクトは オブザーバー と呼ばれます。

いつ使用しますか?

オブジェクト間に 1 対多の依存関係が必要な場合、オブジェクトの状態が変更され、多くの依存関係がそれらの変更を追跡する必要がある場合、オブザーバー パターンを使用できます。

X(Twitter)のようなSNSを使っていて、企業や個人が自分のアカウントを持っていて、好きな企業をフォローして、その企業が新商品やセール商品を投稿したときに通知が欲しいとします。この状況では、Observer パターンが適用されます。

UML図

Observer Pattern

UML 図の例

Observer Pattern

  • setSaleItem メソッドが呼び出されたとき、つまり状態が変更されたとき、setItemChanged メソッドを呼び出します。次に、setItemChanged メソッドは、notifyAccount メソッドを呼び出します。
  • Company クラスの notifyAccount メソッドは、各フォロワーを反復し、follower.update(this) などの独自の Company オブジェクトを使用して update メソッドを呼び出します。

Javaでの実装

ICompany インターフェース:

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

IAccount インターフェース:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。