オブザーバー パターンは、オブジェクト間の 1 対多の依存関係を定義する動作パターンです。これにより、1 つのオブジェクトの状態が変化すると、その依存関係すべてが自動的に通知され、更新されます。
オブジェクトの状態変更は サブジェクト と呼ばれ、その依存オブジェクトは オブザーバー と呼ばれます。
オブジェクト間に 1 対多の依存関係が必要な場合、オブジェクトの状態が変更され、多くの依存関係がそれらの変更を追跡する必要がある場合、オブザーバー パターンを使用できます。
X(Twitter)のようなSNSを使っていて、企業や個人が自分のアカウントを持っていて、好きな企業をフォローして、その企業が新商品やセール商品を投稿したときに通知が欲しいとします。この状況では、Observer パターンが適用されます。
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 サイトの他の関連記事を参照してください。