Observer パターン コード例

Observer パターン

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/02/26 16:46 UTC 版)

コード例

Python

以下のコードは Python 3.x で Observer パターンを記述したものである。引数を1つ受け取るupdate()メソッドを持つオブジェクトであれば、リスナーとして何でも受け付ける(ダック・タイピング)。なお、例ではリスナーの集合を保持するためにリストを使用しているため、同じオブジェクトの多重登録を許可する実装となっている。

class Listener:
    def __init__(self, name):
        self.name = name

    def update(self, event):
        print(self.name, "received event", event)

class Subject:
    def __init__(self):
        self.listeners = []

    def add_listener(self, listener):
        self.listeners.append(listener)

    def remove_listener(self, listener):
        self.listeners.remove(listener)

    def notify_listeners(self, event):
        for listener in self.listeners:
            listener.update(event)

subject = Subject()
listenerA = Listener("<listener A>")
subject.add_listener(listenerA)
listenerB = Listener("<listener B>")
subject.add_listener(listenerB)
# subject には2つのリスナーが登録されている。
subject.notify_listeners("<event 1>")

出力:

<listener A> received event <event 1>
<listener B> received event <event 1>

Java

ロックを避けるため、CopyOnWriteArraySetを使用する例を示す。スレッドセーフにする必要がない、あるいはsynchronizedで同期するのであれば、HashSetTreeSetを使ってもかまわないが、コンテナの実装によっては順序が保証されず、リスナーを追加したときの順番でupdate()が呼ばれるとは限らない。

// Listener.java

public interface Listener {
    public void update(String event);
}
// Subject.java

import java.util.concurrent.CopyOnWriteArraySet;
import java.util.Set;

public class Subject {
    private final Set<Listener> listenerSet = new CopyOnWriteArraySet<Listener>();

    public void addListener(Listener listener) {
        listenerSet.add(listener);
    }

    public void removeListener(Listener listener) {
        listenerSet.remove(listener);
    }

    public void notifyListeners(String event) {
        for (Listener listener : listenerSet) {
            listener.update(event);
        }
    }
}
// Main.java

class ListenerImpl implements Listener {
    private final String name;

    public ListenerImpl(String name) {
        this.name = name;
    }

    @Override
    public void update(String event) {
        System.out.println(this.name + " received event " + event);
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Subject subject = new Subject();
        Listener listenerA = new ListenerImpl("<listener A>");
        subject.addListener(listenerA);
        Listener listenerB = new ListenerImpl("<listener B>");
        subject.addListener(listenerB);
        subject.notifyListeners("<event 1>");
    }
}

出力結果はPythonの例と同じである。


注釈

  1. ^ 「登録する」動作を意味するregister()という名前が使われることもある。
  2. ^ 「登録解除する」動作を意味するunregister()という名前が使われることもある。

出典



「Observer パターン」の続きの解説一覧



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Observer パターン」の関連用語

Observer パターンのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Observer パターンのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのObserver パターン (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS