Observer pattern
Software design pattern based on an event-updated object with a list of dependents
- 31 min read
- 5 chapters
Related on Lably
Through State (computer science), Method (computer programming) and Event (computing)
This pattern creates a one-to-many dependency where multiple observers can listen to a single subject, but the coupling is typically synchronous and direct—the subject calls observer methods when changes occur, though asynchronous implementations using event queues are possible. Unlike the publish-subscribe pattern, there is no intermediary broker; the subject and observers have direct references to each other.
It is commonly used to implement event handling systems in event-driven programming, particularly in-process systems like GUI toolkits or MVC frameworks. This makes the pattern well-suited to processing data that arrives unpredictably—such as user input, HTTP requests, GPIO signals, updates from distributed databases, or changes in a GUI model.
Overview
The observer design pattern is a behavioural pattern listed among the 23 well-known "Gang of Four" design patterns that address recurring design challenges in order to design flexible and reusable object-oriented software, yielding objects that are easier to implement, change, test, and reuse.
The observer pattern addresses the following requirements:
- A one-to-many dependency between objects should be defined without making the objects tightly coupled.
- When one object changes state, an open-ended number of dependent objects should be updated automatically.
- An object can notify multiple other objects.
The naive approach would be for one object (subject) to directly call specific methods on each dependent object. This creates tight coupling because the subject must know the concrete types and specific interfaces of all dependent objects, making the code inflexible and hard to extend. However, this direct approach may be preferable in performance-critical scenarios (such as low-level kernel structures or real-time systems) where the overhead of abstraction is unacceptable and compile-time optimization is crucial.
The observer pattern provides a more flexible alternative by establishing a standard notification protocol:
- Define
SubjectandObserverobjects with standardized interfaces. - When a subject changes state, all registered observers are notified and updated automatically.
- The subject manages its own state while also maintaining a list of observers and notifying them of state changes by calling their
update()operation. - The responsibility of observers is to register and unregister themselves with a subject (in order to be notified of state changes) and to update their state (to synchronize it with the subject's state) when they are notified.
This approach makes subject and observers loosely coupled through interface standardization. The subject only needs to know that observers implement the update() method—it has no knowledge of observers' concrete types or internal implementation details. Observers can be added and removed independently at run time.
Sign in to keep reading
4 more chapters are free with a Lably account.
Relationship to publish–subscribe
The observer pattern and the publish–subscribe pattern are closely related and often confused, as both support one-to-many communication between components. However, they differ significantly in architecture, degree of coupling, and common use cases.
The table below summarizes the key differences:
In practice, publish–subscribe systems evolved to address several limitations of the observer pattern. A typical observer implementation creates a tight coupling between the subject and its observers. This may limit scalability, flexibility, and maintainability, especially in distributed environments. Subjects and observers must conform to a shared interface, and both parties are aware of each other’s presence.
To reduce this coupling, publish–subscribe systems introduce a message broker or event bus that intermediates between publishers and subscribers. This additional layer removes the need for direct references, allowing systems to evolve independently. Brokers may also support features like message persistence, delivery guarantees, topic-based filtering, and asynchronous communication.
In some systems, the observer pattern is used internally to implement subscription mechanisms behind a publish–subscribe interface. In other cases, the patterns are applied independently. For example, JavaScript libraries and frameworks often offer both observer-like subscriptions (e.g., via callback registration) and decoupled pub-sub mechanisms (e.g., via event emitters or signals).
Historically, in early graphical operating systems like OS/2 and Microsoft Windows, the terms "publish–subscribe" and "event-driven programming" were often used as synonyms for the observer pattern.
The observer pattern, as formalized in Design Patterns, deliberately omits concerns such as unsubscription, notification filtering, delivery guarantees, and message logging. These advanced capabilities are typically implemented in robust message queuing systems, where the observer pattern may serve as a foundational mechanism but is not sufficient by itself.
Related patterns include mediator and singleton.
Limitations and solutions
Strong vs. weak references
A common drawback of the observer pattern is the potential for memory leaks, known as the lapsed listener problem. This occurs when a subject maintains strong references to its observers, preventing them from being garbage collected even if they are no longer needed elsewhere. Because the pattern typically requires both explicit registration and deregistration (as in the dispose pattern), forgetting to unregister observers can leave dangling references. This issue can be mitigated by using weak references for observer references, allowing the garbage collector to reclaim observer objects that are no longer in use.
Throttling and temporal decoupling
In some applications, particularly user interfaces, the subject's state may change so frequently that notifying observers on every change is inefficient or counterproductive. For example, a view that re-renders on every minor change in a data model might become unresponsive or flicker.
In such cases, the observer pattern can be modified to decouple notifications temporally by introducing a throttling mechanism, such as a timer. Rather than updating on every state change, the observer polls the subject or is notified at regular intervals, rendering an approximate but stable view of the model.
This approach is commonly used for elements like progress bars, where the underlying process changes state rapidly. Instead of responding to every minor increment, the observer updates the visual display periodically, improving performance and usability.
This form of temporal decoupling allows observers to remain responsive without being overwhelmed by high-frequency updates, while still reflecting the overall trend or progress of the subject’s state.
Structure
UML class and sequence diagram
In this UML class diagram, the Subject class does not update the state of dependent objects directly. Instead, Subject refers to the Observer interface (update()) for updating state, which makes the Subject independent of how the state of dependent objects is updated. The Observer1 and Observer2 classes implement the Observer interface by synchronizing their state with subject's state.
The UML sequence diagram shows the runtime interactions: The Observer1 and Observer2 objects call attach(this) on Subject1 to register themselves. Assuming that the state of Subject1 changes, Subject1 calls notify() on itself. notify() calls update() on the registered Observer1 and Observer2objects, which request the changed data (getState()) from Subject1 to update (synchronize) their state.
UML class diagram
Example
While the library classes java.util.Observer and java.util.Observable exist, they have been deprecated in Java 9 because the model implemented was quite limited.
Below is an example written in Java that takes keyboard input and handles each input line as an event. When a string is supplied from System.in, the method notifyObservers() is then called in order to notify all observers of the event's occurrence, in the form of an invocation of their update methods.
Java
<span id="mw1g"></span><span class="kn" id="mw1w">package</span><span class="w" id="mw2A"> </span><span class="nn" id="mw2Q">org.wikipedia.examples</span><span class="p" id="mw2g">;</span> <span class="kn" id="mw2w">import</span><span class="w" id="mw3A"> </span><span class="nn" id="mw3Q">java.util.ArrayList</span><span class="p" id="mw3g">;</span> <span class="kn" id="mw3w">import</span><span class="w" id="mw4A"> </span><span class="nn" id="mw4Q">java.util.List</span><span class="p" id="mw4g">;</span> <span class="kn" id="mw4w">import</span><span class="w" id="mw5A"> </span><span class="nn" id="mw5Q">java.util.Scanner</span><span class="p" id="mw5g">;</span> <span class="kd" id="mw5w">interface</span> <span class="nc" id="mw6A">Observer</span><span class="w" id="mw6Q"> </span><span class="p" id="mw6g">{</span> <span class="w" id="mw6w"> </span><span class="kt" id="mw7A">void</span><span class="w" id="mw7Q"> </span><span class="nf" id="mw7g">update</span><span class="p" id="mw7w">(</span><span class="n" id="mw8A">String</span><span class="w" id="mw8Q"> </span><span class="n" id="mw8g">event</span><span class="p" id="mw8w">);</span> <span class="p" id="mw9A">}</span> <span class="w" id="mw9Q"> </span> <span class="kd" id="mw9g">class</span> <span class="nc" id="mw9w">EventSource</span><span class="w" id="mw-A"> </span><span class="p" id="mw-Q">{</span> <span class="w" id="mw-g"> </span><span class="n" id="mw-w">List</span><span class="o" id="mw_A"><</span><span class="n" id="mw_Q">Observer</span><span class="o" id="mw_g">></span><span class="w" id="mw_w"> </span><span class="n" id="mwAQA">observers</span><span class="w" id="mwAQE"> </span><span class="o" id="mwAQI">=</span><span class="w" id="mwAQM"> </span><span class="k" id="mwAQQ">new</span><span class="w" id="mwAQU"> </span><span class="n" id="mwAQY">ArrayList</span><span class="o" id="mwAQc"><></span><span class="p" id="mwAQg">();</span> <span class="w" id="mwAQk"> </span> <span class="w" id="mwAQo"> </span><span class="kd" id="mwAQs">public</span><span class="w" id="mwAQw"> </span><span class="kt" id="mwAQ0">void</span><span class="w" id="mwAQ4"> </span><span class="nf" id="mwAQ8">notifyObservers</span><span class="p" id="mwARA">(</span><span class="n" id="mwARE">String</span><span class="w" id="mwARI"> </span><span class="n" id="mwARM">event</span><span class="p" id="mwARQ">)</span><span class="w" id="mwARU"> </span><span class="p" id="mwARY">{</span> <span class="w" id="mwARc"> </span><span class="n" id="mwARg">observers</span><span class="p" id="mwARk">.</span><span class="na" id="mwARo">forEach</span><span class="p" id="mwARs">(</span><span class="n" id="mwARw">observer</span><span class="w" id="mwAR0"> </span><span class="o" id="mwAR4">-></span><span class="w" id="mwAR8"> </span><span class="n" id="mwASA">observer</span><span class="p" id="mwASE">.</span><span class="na" id="mwASI">update</span><span class="p" id="mwASM">(</span><span class="n" id="mwASQ">event</span><span class="p" id="mwASU">));</span> <span class="w" id="mwASY"> </span><span class="p" id="mwASc">}</span> <span class="w" id="mwASg"> </span> <span class="w" id="mwASk"> </span><span class="kd" id="mwASo">public</span><span class="w" id="mwASs"> </span><span class="kt" id="mwASw">void</span><span class="w" id="mwAS0"> </span><span class="nf" id="mwAS4">addObserver</span><span class="p" id="mwAS8">(</span><span class="n" id="mwATA">Observer</span><span class="w" id="mwATE"> </span><span class="n" id="mwATI">observer</span><span class="p" id="mwATM">)</span><span class="w" id="mwATQ"> </span><span class="p" id="mwATU">{</span> <span class="w" id="mwATY"> </span><span class="n" id="mwATc">observers</span><span class="p" id="mwATg">.</span><span class="na" id="mwATk">add</span><span class="p" id="mwATo">(</span><span class="n" id="mwATs">observer</span><span class="p" id="mwATw">);</span> <span class="w" id="mwAT0"> </span><span class="p" id="mwAT4">}</span> <span class="w" id="mwAT8"> </span> <span class="w" id="mwAUA"> </span><span class="kd" id="mwAUE">public</span><span class="w" id="mwAUI"> </span><span class="kt" id="mwAUM">void</span><span class="w" id="mwAUQ"> </span><span class="nf" id="mwAUU">scanSystemIn</span><span class="p" id="mwAUY">()</span><span class="w" id="mwAUc"> </span><span class="p" id="mwAUg">{</span> <span class="w" id="mwAUk"> </span><span class="n" id="mwAUo">Scanner</span><span class="w" id="mwAUs"> </span><span class="n" id="mwAUw">scanner</span><span class="w" id="mwAU0"> </span><span class="o" id="mwAU4">=</span><span class="w" id="mwAU8"> </span><span class="k" id="mwAVA">new</span><span class="w" id="mwAVE"> </span><span class="n" id="mwAVI">Scanner</span><span class="p" id="mwAVM">(</span><span class="n" id="mwAVQ">System</span><span class="p" id="mwAVU">.</span><span class="na" id="mwAVY">in</span><span class="p" id="mwAVc">);</span> <span class="w" id="mwAVg"> </span><span class="k" id="mwAVk">while</span><span class="w" id="mwAVo"> </span><span class="p" id="mwAVs">(</span><span class="n" id="mwAVw">scanner</span><span class="p" id="mwAV0">.</span><span class="na" id="mwAV4">hasNextLine</span><span class="p" id="mwAV8">())</span><span class="w" id="mwAWA"> </span><span class="p" id="mwAWE">{</span> <span class="w" id="mwAWI"> </span><span class="n" id="mwAWM">String</span><span class="w" id="mwAWQ"> </span><span class="n" id="mwAWU">line</span><span class="w" id="mwAWY"> </span><span class="o" id="mwAWc">=</span><span class="w" id="mwAWg"> </span><span class="n" id="mwAWk">scanner</span><span class="p" id="mwAWo">.</span><span class="na" id="mwAWs">nextLine</span><span class="p" id="mwAWw">();</span> <span class="w" id="mwAW0"> </span><span class="n" id="mwAW4">notifyObservers</span><span class="p" id="mwAW8">(</span><span class="n" id="mwAXA">line</span><span class="p" id="mwAXE">);</span> <span class="w" id="mwAXI"> </span><span class="p" id="mwAXM">}</span> <span class="w" id="mwAXQ"> </span><span class="p" id="mwAXU">}</span> <span class="p" id="mwAXY">}</span> <span class="kd" id="mwAXc">public</span><span class="w" id="mwAXg"> </span><span class="kd" id="mwAXk">class</span> <span class="nc" id="mwAXo">ObserverDemo</span><span class="w" id="mwAXs"> </span><span class="p" id="mwAXw">{</span> <span class="w" id="mwAX0"> </span><span class="kd" id="mwAX4">public</span><span class="w" id="mwAX8"> </span><span class="kd" id="mwAYA">static</span><span class="w" id="mwAYE"> </span><span class="kt" id="mwAYI">void</span><span class="w" id="mwAYM"> </span><span class="nf" id="mwAYQ">main</span><span class="p" id="mwAYU">(</span><span class="n" id="mwAYY">String</span><span class="o" id="mwAYc">[]</span><span class="w" id="mwAYg"> </span><span class="n" id="mwAYk">args</span><span class="p" id="mwAYo">)</span><span class="w" id="mwAYs"> </span><span class="p" id="mwAYw">{</span> <span class="w" id="mwAY0"> </span><span class="n" id="mwAY4">System</span><span class="p" id="mwAY8">.</span><span class="na" id="mwAZA">out</span><span class="p" id="mwAZE">.</span><span class="na" id="mwAZI">println</span><span class="p" id="mwAZM">(</span><span class="s" id="mwAZQ">"Enter Text: "</span><span class="p" id="mwAZU">);</span> <span class="w" id="mwAZY"> </span><span class="n" id="mwAZc">EventSource</span><span class="w" id="mwAZg"> </span><span class="n" id="mwAZk">eventSource</span><span class="w" id="mwAZo"> </span><span class="o" id="mwAZs">=</span><span class="w" id="mwAZw"> </span><span class="k" id="mwAZ0">new</span><span class="w" id="mwAZ4"> </span><span class="n" id="mwAZ8">EventSource</span><span class="p" id="mwAaA">();</span> <span class="w" id="mwAaE"> </span> <span class="w" id="mwAaI"> </span><span class="n" id="mwAaM">eventSource</span><span class="p" id="mwAaQ">.</span><span class="na" id="mwAaU">addObserver</span><span class="p" id="mwAaY">(</span><span class="n" id="mwAac">event</span><span class="w" id="mwAag"> </span><span class="o" id="mwAak">-></span><span class="w" id="mwAao"> </span><span class="n" id="mwAas">System</span><span class="p" id="mwAaw">.</span><span class="na" id="mwAa0">out</span><span class="p" id="mwAa4">.</span><span class="na" id="mwAa8">printf</span><span class="p" id="mwAbA">(</span><span class="s" id="mwAbE">"Received response: %s%n"</span><span class="p" id="mwAbI">,</span><span class="w" id="mwAbM"> </span><span class="n" id="mwAbQ">event</span><span class="p" id="mwAbU">));</span> <span class="w" id="mwAbY"> </span><span class="n" id="mwAbc">eventSource</span><span class="p" id="mwAbg">.</span><span class="na" id="mwAbk">scanSystemIn</span><span class="p" id="mwAbo">();</span> <span class="w" id="mwAbs"> </span><span class="p" id="mwAbw">}</span> <span class="p" id="mwAb0">}</span>C#
C# provides the IObservable. and IObserver interfaces as well as documentation on how to implement the design pattern.
<span id="mwAdA"></span><span class="k" id="mwAdE">namespace</span><span class="w" id="mwAdI"> </span><span class="nn" id="mwAdM">Wikipedia.Examples</span><span class="p" id="mwAdQ">;</span> <span class="k" id="mwAdU">using</span><span class="w" id="mwAdY"> </span><span class="nn" id="mwAdc">System</span><span class="p" id="mwAdg">;</span> <span class="k" id="mwAdk">using</span><span class="w" id="mwAdo"> </span><span class="nn" id="mwAds">System.Collections.Generic</span><span class="p" id="mwAdw">;</span> <span class="k" id="mwAd0">class</span><span class="w" id="mwAd4"> </span><span class="nc" id="mwAd8">Payload</span> <span class="p" id="mwAeA">{</span> <span class="w" id="mwAeE"> </span><span class="k" id="mwAeI">internal</span><span class="w" id="mwAeM"> </span><span class="kt" id="mwAeQ">string</span><span class="w" id="mwAeU"> </span><span class="n" id="mwAeY">Message</span><span class="w" id="mwAec"> </span><span class="p" id="mwAeg">{</span><span class="w" id="mwAek"> </span><span class="k" id="mwAeo">get</span><span class="p" id="mwAes">;</span><span class="w" id="mwAew"> </span><span class="k" id="mwAe0">init</span><span class="p" id="mwAe4">;</span><span class="w" id="mwAe8"> </span><span class="p" id="mwAfA">}</span> <span class="p" id="mwAfE">}</span> <span class="k" id="mwAfI">class</span><span class="w" id="mwAfM"> </span><span class="nc" id="mwAfQ">Subject</span><span class="w" id="mwAfU"> </span><span class="p" id="mwAfY">:</span><span class="w" id="mwAfc"> </span><span class="n" id="mwAfg">IObservable</span><span class="o" id="mwAfk"><</span><span class="n" id="mwAfo">Payload</span><span class="o" id="mwAfs">></span> <span class="p" id="mwAfw">{</span> <span class="w" id="mwAf0"> </span><span class="k" id="mwAf4">private</span><span class="w" id="mwAf8"> </span><span class="k" id="mwAgA">readonly</span><span class="w" id="mwAgE"> </span><span class="n" id="mwAgI">List</span><span class="o" id="mwAgM"><</span><span class="n" id="mwAgQ">IObserver</span><span class="o" id="mwAgU"><</span><span class="n" id="mwAgY">Payload</span><span class="o" id="mwAgc">>></span><span class="w" id="mwAgg"> </span><span class="n" id="mwAgk">_observers</span><span class="w" id="mwAgo"> </span><span class="o" id="mwAgs">=</span><span class="w" id="mwAgw"> </span><span class="k" id="mwAg0">new</span><span class="p" id="mwAg4">();</span> <span class="w" id="mwAg8"> </span><span class="n" id="mwAhA">IDisposable</span><span class="w" id="mwAhE"> </span><span class="n" id="mwAhI">IObservable</span><span class="o" id="mwAhM"><</span><span class="n" id="mwAhQ">Payload</span><span class="o" id="mwAhU">></span><span class="p" id="mwAhY">.</span><span class="n" id="mwAhc">Subscribe</span><span class="p" id="mwAhg">(</span><span class="n" id="mwAhk">IObserver</span><span class="o" id="mwAho"><</span><span class="n" id="mwAhs">Payload</span><span class="o" id="mwAhw">></span><span class="w" id="mwAh0"> </span><span class="n" id="mwAh4">observer</span><span class="p" id="mwAh8">)</span> <span class="w" id="mwAiA"> </span><span class="p" id="mwAiE">{</span><span class="w" id="mwAiI"> </span> <span class="w" id="mwAiM"> </span><span class="k" id="mwAiQ">if</span><span class="w" id="mwAiU"> </span><span class="p" id="mwAiY">(</span><span class="o" id="mwAic">!</span><span class="n" id="mwAig">_observers</span><span class="p" id="mwAik">.</span><span class="n" id="mwAio">Contains</span><span class="p" id="mwAis">(</span><span class="n" id="mwAiw">observer</span><span class="p" id="mwAi0">))</span> <span class="w" id="mwAi4"> </span><span class="p" id="mwAi8">{</span> <span class="w" id="mwAjA"> </span><span class="n" id="mwAjE">_observers</span><span class="p" id="mwAjI">.</span><span class="n" id="mwAjM">Add</span><span class="p" id="mwAjQ">(</span><span class="n" id="mwAjU">observer</span><span class="p" id="mwAjY">);</span> <span class="w" id="mwAjc"> </span><span class="p" id="mwAjg">}</span> <span class="w" id="mwAjk"> </span><span class="k" id="mwAjo">return</span><span class="w" id="mwAjs"> </span><span class="k" id="mwAjw">new</span><span class="w" id="mwAj0"> </span><span class="nf" id="mwAj4">Unsubscriber</span><span class="p" id="mwAj8">(</span><span class="n" id="mwAkA">observer</span><span class="p" id="mwAkE">,</span><span class="w" id="mwAkI"> </span><span class="n" id="mwAkM">_observers</span><span class="p" id="mwAkQ">);</span> <span class="w" id="mwAkU"> </span><span class="p" id="mwAkY">}</span> <span class="w" id="mwAkc"> </span><span class="k" id="mwAkg">internal</span><span class="w" id="mwAkk"> </span><span class="k" id="mwAko">void</span><span class="w" id="mwAks"> </span><span class="nf" id="mwAkw">SendMessage</span><span class="p" id="mwAk0">(</span><span class="kt" id="mwAk4">string</span><span class="w" id="mwAk8"> </span><span class="n" id="mwAlA">message</span><span class="p" id="mwAlE">)</span> <span class="w" id="mwAlI"> </span><span class="p" id="mwAlM">{</span> <span class="w" id="mwAlQ"> </span><span class="k" id="mwAlU">foreach</span><span class="w" id="mwAlY"> </span><span class="p" id="mwAlc">(</span><span class="n" id="mwAlg">IObserver</span><span class="o" id="mwAlk"><</span><span class="n" id="mwAlo">Payload</span><span class="o" id="mwAls">></span><span class="w" id="mwAlw"> </span><span class="n" id="mwAl0">observer</span><span class="w" id="mwAl4"> </span><span class="k" id="mwAl8">in</span><span class="w" id="mwAmA"> </span><span class="n" id="mwAmE">_observers</span><span class="p" id="mwAmI">)</span> <span class="w" id="mwAmM"> </span><span class="p" id="mwAmQ">{</span> <span class="w" id="mwAmU"> </span><span class="n" id="mwAmY">observer</span><span class="p" id="mwAmc">.</span><span class="n" id="mwAmg">OnNext</span><span class="p" id="mwAmk">(</span><span class="k" id="mwAmo">new</span><span class="w" id="mwAms"> </span><span class="n" id="mwAmw">Payload</span><span class="w" id="mwAm0"> </span><span class="p" id="mwAm4">{</span><span class="w" id="mwAm8"> </span><span class="n" id="mwAnA">Message</span><span class="w" id="mwAnE"> </span><span class="o" id="mwAnI">=</span><span class="w" id="mwAnM"> </span><span class="n" id="mwAnQ">message</span><span class="w" id="mwAnU"> </span><span class="p" id="mwAnY">});</span> <span class="w" id="mwAnc"> </span><span class="p" id="mwAng">}</span> <span class="w" id="mwAnk"> </span><span class="p" id="mwAno">}</span> <span class="p" id="mwAns">}</span> <span class="k" id="mwAnw">internal</span><span class="w" id="mwAn0"> </span><span class="k" id="mwAn4">class</span><span class="w" id="mwAn8"> </span><span class="nc" id="mwAoA">Unsubscriber</span><span class="w" id="mwAoE"> </span><span class="p" id="mwAoI">:</span><span class="w" id="mwAoM"> </span><span class="n" id="mwAoQ">IDisposable</span> <span class="p" id="mwAoU">{</span> <span class="w" id="mwAoY"> </span><span class="k" id="mwAoc">private</span><span class="w" id="mwAog"> </span><span class="k" id="mwAok">readonly</span><span class="w" id="mwAoo"> </span><span class="n" id="mwAos">IObserver</span><span class="o" id="mwAow"><</span><span class="n" id="mwAo0">Payload</span><span class="o" id="mwAo4">></span><span class="w" id="mwAo8"> </span><span class="n" id="mwApA">_observer</span><span class="p" id="mwApE">;</span> <span class="w" id="mwApI"> </span><span class="k" id="mwApM">private</span><span class="w" id="mwApQ"> </span><span class="k" id="mwApU">readonly</span><span class="w" id="mwApY"> </span><span class="n" id="mwApc">ICollection</span><span class="o" id="mwApg"><</span><span class="n" id="mwApk">IObserver</span><span class="o" id="mwApo"><</span><span class="n" id="mwAps">Payload</span><span class="o" id="mwApw">>></span><span class="w" id="mwAp0"> </span><span class="n" id="mwAp4">_observers</span><span class="p" id="mwAp8">;</span> <span class="w" id="mwAqA"> </span><span class="k" id="mwAqE">internal</span><span class="w" id="mwAqI"> </span><span class="nf" id="mwAqM">Unsubscriber</span><span class="p" id="mwAqQ">(</span> <span class="w" id="mwAqU"> </span><span class="n" id="mwAqY">IObserver</span><span class="o" id="mwAqc"><</span><span class="n" id="mwAqg">Payload</span><span class="o" id="mwAqk">></span><span class="w" id="mwAqo"> </span><span class="n" id="mwAqs">observer</span><span class="p" id="mwAqw">,</span> <span class="w" id="mwAq0"> </span><span class="n" id="mwAq4">ICollection</span><span class="o" id="mwAq8"><</span><span class="n" id="mwArA">IObserver</span><span class="o" id="mwArE"><</span><span class="n" id="mwArI">Payload</span><span class="o" id="mwArM">>></span><span class="w" id="mwArQ"> </span><span class="n" id="mwArU">observers</span><span class="p" id="mwArY">)</span> <span class="w" id="mwArc"> </span><span class="p" id="mwArg">{</span> <span class="w" id="mwArk"> </span><span class="n" id="mwAro">_observer</span><span class="w" id="mwArs"> </span><span class="o" id="mwArw">=</span><span class="w" id="mwAr0"> </span><span class="n" id="mwAr4">observer</span><span class="p" id="mwAr8">;</span> <span class="w" id="mwAsA"> </span><span class="n" id="mwAsE">_observers</span><span class="w" id="mwAsI"> </span><span class="o" id="mwAsM">=</span><span class="w" id="mwAsQ"> </span><span class="n" id="mwAsU">observers</span><span class="p" id="mwAsY">;</span> <span class="w" id="mwAsc"> </span><span class="p" id="mwAsg">}</span> <span class="w" id="mwAsk"> </span><span class="k" id="mwAso">void</span><span class="w" id="mwAss"> </span><span class="n" id="mwAsw">IDisposable</span><span class="p" id="mwAs0">.</span><span class="n" id="mwAs4">Dispose</span><span class="p" id="mwAs8">()</span> <span class="w" id="mwAtA"> </span><span class="p" id="mwAtE">{</span> <span class="w" id="mwAtI"> </span><span class="k" id="mwAtM">if</span><span class="w" id="mwAtQ"> </span><span class="p" id="mwAtU">(</span><span class="n" id="mwAtY">_observer</span><span class="w" id="mwAtc"> </span><span class="o" id="mwAtg">!=</span><span class="w" id="mwAtk"> </span><span class="k" id="mwAto">null</span><span class="w" id="mwAts"> </span><span class="o" id="mwAtw">&&</span><span class="w" id="mwAt0"> </span><span class="n" id="mwAt4">_observers</span><span class="p" id="mwAt8">.</span><span class="n" id="mwAuA">Contains</span><span class="p" id="mwAuE">(</span><span class="n" id="mwAuI">_observer</span><span class="p" id="mwAuM">))</span> <span class="w" id="mwAuQ"> </span><span class="p" id="mwAuU">{</span> <span class="w" id="mwAuY"> </span><span class="n" id="mwAuc">_observers</span><span class="p" id="mwAug">.</span><span class="n" id="mwAuk">Remove</span><span class="p" id="mwAuo">(</span><span class="n" id="mwAus">_observer</span><span class="p" id="mwAuw">);</span> <span class="w" id="mwAu0"> </span><span class="p" id="mwAu4">}</span> <span class="w" id="mwAu8"> </span><span class="p" id="mwAvA">}</span> <span class="p" id="mwAvE">}</span> <span class="k" id="mwAvI">internal</span><span class="w" id="mwAvM"> </span><span class="k" id="mwAvQ">class</span><span class="w" id="mwAvU"> </span><span class="nc" id="mwAvY">Observer</span><span class="w" id="mwAvc"> </span><span class="p" id="mwAvg">:</span><span class="w" id="mwAvk"> </span><span class="n" id="mwAvo">IObserver</span><span class="o" id="mwAvs"><</span><span class="n" id="mwAvw">Payload</span><span class="o" id="mwAv0">></span> <span class="p" id="mwAv4">{</span> <span class="w" id="mwAv8"> </span><span class="k" id="mwAwA">private</span><span class="w" id="mwAwE"> </span><span class="kt" id="mwAwI">string</span><span class="w" id="mwAwM"> </span><span class="n" id="mwAwQ">_message</span><span class="p" id="mwAwU">;</span> <span class="w" id="mwAwY"> </span><span class="k" id="mwAwc">public</span><span class="w" id="mwAwg"> </span><span class="k" id="mwAwk">void</span><span class="w" id="mwAwo"> </span><span class="nf" id="mwAws">OnCompleted</span><span class="p" id="mwAww">()</span> <span class="w" id="mwAw0"> </span><span class="p" id="mwAw4">{</span> <span class="w" id="mwAw8"> </span><span class="p" id="mwAxA">}</span> <span class="w" id="mwAxE"> </span><span class="k" id="mwAxI">public</span><span class="w" id="mwAxM"> </span><span class="k" id="mwAxQ">void</span><span class="w" id="mwAxU"> </span><span class="nf" id="mwAxY">OnError</span><span class="p" id="mwAxc">(</span><span class="n" id="mwAxg">Exception</span><span class="w" id="mwAxk"> </span><span class="n" id="mwAxo">error</span><span class="p" id="mwAxs">)</span> <span class="w" id="mwAxw"> </span><span class="p" id="mwAx0">{</span> <span class="w" id="mwAx4"> </span><span class="p" id="mwAx8">}</span> <span class="w" id="mwAyA"> </span><span class="k" id="mwAyE">public</span><span class="w" id="mwAyI"> </span><span class="k" id="mwAyM">void</span><span class="w" id="mwAyQ"> </span><span class="nf" id="mwAyU">OnNext</span><span class="p" id="mwAyY">(</span><span class="n" id="mwAyc">Payload</span><span class="w" id="mwAyg"> </span><span class="k" id="mwAyk">value</span><span class="p" id="mwAyo">)</span> <span class="w" id="mwAys"> </span><span class="p" id="mwAyw">{</span> <span class="w" id="mwAy0"> </span><span class="n" id="mwAy4">_message</span><span class="w" id="mwAy8"> </span><span class="o" id="mwAzA">=</span><span class="w" id="mwAzE"> </span><span class="k" id="mwAzI">value</span><span class="p" id="mwAzM">.</span><span class="n" id="mwAzQ">Message</span><span class="p" id="mwAzU">;</span> <span class="w" id="mwAzY"> </span><span class="p" id="mwAzc">}</span> <span class="w" id="mwAzg"> </span><span class="k" id="mwAzk">internal</span><span class="w" id="mwAzo"> </span><span class="n" id="mwAzs">IDisposable</span><span class="w" id="mwAzw"> </span><span class="nf" id="mwAz0">Register</span><span class="p" id="mwAz4">(</span><span class="n" id="mwAz8">IObservable</span><span class="o" id="mwA0A"><</span><span class="n" id="mwA0E">Payload</span><span class="o" id="mwA0I">></span><span class="w" id="mwA0M"> </span><span class="n" id="mwA0Q">subject</span><span class="p" id="mwA0U">)</span> <span class="w" id="mwA0Y"> </span><span class="p" id="mwA0c">{</span> <span class="w" id="mwA0g"> </span><span class="k" id="mwA0k">return</span><span class="w" id="mwA0o"> </span><span class="n" id="mwA0s">subject</span><span class="p" id="mwA0w">.</span><span class="n" id="mwA00">Subscribe</span><span class="p" id="mwA04">(</span><span class="k" id="mwA08">this</span><span class="p" id="mwA1A">);</span> <span class="w" id="mwA1E"> </span><span class="p" id="mwA1I">}</span> <span class="p" id="mwA1M">}</span>C++
This is a C++23 implementation.
<span id="mwA1g"></span><span class="k" id="mwA1k">import</span><span class="w" id="mwA1o"> </span><span class="n" id="mwA1s">std</span><span class="p" id="mwA1w">;</span> <span class="k" id="mwA10">using</span><span class="w" id="mwA14"> </span><span class="n" id="mwA18">std</span><span class="o" id="mwA2A">::</span><span class="n" id="mwA2E">reference_wrapper</span><span class="p" id="mwA2I">;</span> <span class="k" id="mwA2M">using</span><span class="w" id="mwA2Q"> </span><span class="n" id="mwA2U">std</span><span class="o" id="mwA2Y">::</span><span class="n" id="mwA2c">vector</span><span class="p" id="mwA2g">;</span> <span class="k" id="mwA2k">class</span><span class="w" id="mwA2o"> </span><span class="nc" id="mwA2s">Subject</span><span class="p" id="mwA2w">;</span><span class="w" id="mwA20"> </span><span class="c1" id="mwA24">// Forward declaration for usage in Observer</span> <span class="k" id="mwA28">class</span><span class="w" id="mwA3A"> </span><span class="nc" id="mwA3E">Observer</span><span class="w" id="mwA3I"> </span><span class="p" id="mwA3M">{</span> <span class="k" id="mwA3Q">private</span><span class="o" id="mwA3U">:</span> <span class="w" id="mwA3Y"> </span><span class="c1" id="mwA3c">// Reference to a Subject object to detach in the destructor</span> <span class="w" id="mwA3g"> </span><span class="n" id="mwA3k">Subject</span><span class="o" id="mwA3o">&</span><span class="w" id="mwA3s"> </span><span class="n" id="mwA3w">subject</span><span class="p" id="mwA30">;</span> <span class="k" id="mwA34">public</span><span class="o" id="mwA38">:</span> <span class="w" id="mwA4A"> </span><span class="k" id="mwA4E">explicit</span><span class="w" id="mwA4I"> </span><span class="n" id="mwA4M">Observer</span><span class="p" id="mwA4Q">(</span><span class="n" id="mwA4U">Subject</span><span class="o" id="mwA4Y">&</span><span class="w" id="mwA4c"> </span><span class="n" id="mwA4g">subj</span><span class="p" id="mwA4k">)</span><span class="o" id="mwA4o">:</span><span class="w" id="mwA4s"> </span> <span class="w" id="mwA4w"> </span><span class="n" id="mwA40">subject</span><span class="p" id="mwA44">{</span><span class="n" id="mwA48">subj</span><span class="p" id="mwA5A">}</span><span class="w" id="mwA5E"> </span><span class="p" id="mwA5I">{</span> <span class="w" id="mwA5M"> </span><span class="n" id="mwA5Q">subject</span><span class="p" id="mwA5U">.</span><span class="n" id="mwA5Y">attach</span><span class="p" id="mwA5c">(</span><span class="o" id="mwA5g">*</span><span class="k" id="mwA5k">this</span><span class="p" id="mwA5o">);</span> <span class="w" id="mwA5s"> </span><span class="p" id="mwA5w">}</span> <span class="w" id="mwA50"> </span><span class="k" id="mwA54">virtual</span><span class="w" id="mwA58"> </span><span class="o" id="mwA6A">~</span><span class="n" id="mwA6E">Observer</span><span class="p" id="mwA6I">()</span><span class="w" id="mwA6M"> </span><span class="p" id="mwA6Q">{</span> <span class="w" id="mwA6U"> </span><span class="n" id="mwA6Y">subject</span><span class="p" id="mwA6c">.</span><span class="n" id="mwA6g">detach</span><span class="p" id="mwA6k">(</span><span class="o" id="mwA6o">*</span><span class="k" id="mwA6s">this</span><span class="p" id="mwA6w">);</span> <span class="w" id="mwA60"> </span><span class="p" id="mwA64">}</span> <span class="w" id="mwA68"> </span> <span class="w" id="mwA7A"> </span><span class="n" id="mwA7E">Observer</span><span class="p" id="mwA7I">(</span><span class="k" id="mwA7M">const</span><span class="w" id="mwA7Q"> </span><span class="n" id="mwA7U">Observer</span><span class="o" id="mwA7Y">&</span><span class="p" id="mwA7c">)</span><span class="w" id="mwA7g"> </span><span class="o" id="mwA7k">=</span><span class="w" id="mwA7o"> </span><span class="k" id="mwA7s">delete</span><span class="p" id="mwA7w">;</span> <span class="w" id="mwA70"> </span><span class="n" id="mwA74">Observer</span><span class="o" id="mwA78">&</span><span class="w" id="mwA8A"> </span><span class="k" id="mwA8E">operator</span><span class="o" id="mwA8I">=</span><span class="p" id="mwA8M">(</span><span class="k" id="mwA8Q">const</span><span class="w" id="mwA8U"> </span><span class="n" id="mwA8Y">Observer</span><span class="o" id="mwA8c">&</span><span class="p" id="mwA8g">)</span><span class="w" id="mwA8k"> </span><span class="o" id="mwA8o">=</span><span class="w" id="mwA8s"> </span><span class="k" id="mwA8w">delete</span><span class="p" id="mwA80">;</span> <span class="w" id="mwA84"> </span><span class="k" id="mwA88">virtual</span><span class="w" id="mwA9A"> </span><span class="kt" id="mwA9E">void</span><span class="w" id="mwA9I"> </span><span class="nf" id="mwA9M">update</span><span class="p" id="mwA9Q">(</span><span class="n" id="mwA9U">Subject</span><span class="o" id="mwA9Y">&</span><span class="w" id="mwA9c"> </span><span class="n" id="mwA9g">s</span><span class="p" id="mwA9k">)</span><span class="w" id="mwA9o"> </span><span class="k" id="mwA9s">const</span><span class="w" id="mwA9w"> </span><span class="o" id="mwA90">=</span><span class="w" id="mwA94"> </span><span class="mi" id="mwA98">0</span><span class="p" id="mwA-A">;</span> <span class="p" id="mwA-E">};</span> <span class="c1" id="mwA-I">// Subject is the base class for event generation</span> <span class="k" id="mwA-M">class</span><span class="w" id="mwA-Q"> </span><span class="nc" id="mwA-U">Subject</span><span class="w" id="mwA-Y"> </span><span class="p" id="mwA-c">{</span> <span class="k" id="mwA-g">private</span><span class="o" id="mwA-k">:</span> <span class="w" id="mwA-o"> </span><span class="n" id="mwA-s">vector</span><span class="o" id="mwA-w"><</span><span class="n" id="mwA-0">refObserver</span><span class="o" id="mwA-4">></span><span class="w" id="mwA-8"> </span><span class="n" id="mwA_A">observers</span><span class="p" id="mwA_E">;</span> <span class="k" id="mwA_I">public</span><span class="o" id="mwA_M">:</span> <span class="w" id="mwA_Q"> </span><span class="k" id="mwA_U">using</span><span class="w" id="mwA_Y"> </span><span class="n" id="mwA_c">RefObserver</span><span class="w" id="mwA_g"> </span><span class="o" id="mwA_k">=</span><span class="w" id="mwA_o"> </span><span class="n" id="mwA_s">reference_wrapper</span><span class="o" id="mwA_w"><</span><span class="k" id="mwA_0">const</span><span class="w" id="mwA_4"> </span><span class="n" id="mwA_8">Observer</span><span class="o" id="mwBAA">></span><span class="p" id="mwBAE">;</span> <span class="w" id="mwBAI"> </span> <span class="w" id="mwBAM"> </span><span class="c1" id="mwBAQ">// Notify all the attached observers</span> <span class="w" id="mwBAU"> </span><span class="kt" id="mwBAY">void</span><span class="w" id="mwBAc"> </span><span class="nf" id="mwBAg">notify</span><span class="p" id="mwBAk">()</span><span class="w" id="mwBAo"> </span><span class="p" id="mwBAs">{</span> <span class="w" id="mwBAw"> </span><span class="k" id="mwBA0">for</span><span class="w" id="mwBA4"> </span><span class="p" id="mwBA8">(</span><span class="k" id="mwBBA">const</span><span class="w" id="mwBBE"> </span><span class="n" id="mwBBI">Observer</span><span class="o" id="mwBBM">&</span><span class="w" id="mwBBQ"> </span><span class="n" id="mwBBU">x</span><span class="o" id="mwBBY">:</span><span class="w" id="mwBBc"> </span><span class="n" id="mwBBg">observers</span><span class="p" id="mwBBk">)</span><span class="w" id="mwBBo"> </span><span class="p" id="mwBBs">{</span> <span class="w" id="mwBBw"> </span><span class="n" id="mwBB0">x</span><span class="p" id="mwBB4">.</span><span class="n" id="mwBB8">get</span><span class="p" id="mwBCA">().</span><span class="n" id="mwBCE">update</span><span class="p" id="mwBCI">(</span><span class="o" id="mwBCM">*</span><span class="k" id="mwBCQ">this</span><span class="p" id="mwBCU">);</span> <span class="w" id="mwBCY"> </span><span class="p" id="mwBCc">}</span> <span class="w" id="mwBCg"> </span><span class="p" id="mwBCk">}</span> <span class="w" id="mwBCo"> </span> <span class="w" id="mwBCs"> </span><span class="c1" id="mwBCw">// Add an observer</span> <span class="w" id="mwBC0"> </span><span class="kt" id="mwBC4">void</span><span class="w" id="mwBC8"> </span><span class="nf" id="mwBDA">attach</span><span class="p" id="mwBDE">(</span><span class="k" id="mwBDI">const</span><span class="w" id="mwBDM"> </span><span class="n" id="mwBDQ">Observer</span><span class="o" id="mwBDU">&</span><span class="w" id="mwBDY"> </span><span class="n" id="mwBDc">observer</span><span class="p" id="mwBDg">)</span><span class="w" id="mwBDk"> </span><span class="p" id="mwBDo">{</span> <span class="w" id="mwBDs"> </span><span class="n" id="mwBDw">observers</span><span class="p" id="mwBD0">.</span><span class="n" id="mwBD4">push_back</span><span class="p" id="mwBD8">(</span><span class="n" id="mwBEA">observer</span><span class="p" id="mwBEE">);</span> <span class="w" id="mwBEI"> </span><span class="p" id="mwBEM">}</span> <span class="w" id="mwBEQ"> </span> <span class="w" id="mwBEU"> </span><span class="c1" id="mwBEY">// Remove an observer</span> <span class="w" id="mwBEc"> </span><span class="kt" id="mwBEg">void</span><span class="w" id="mwBEk"> </span><span class="nf" id="mwBEo">detach</span><span class="p" id="mwBEs">(</span><span class="n" id="mwBEw">Observer</span><span class="o" id="mwBE0">&</span><span class="w" id="mwBE4"> </span><span class="n" id="mwBE8">observer</span><span class="p" id="mwBFA">)</span><span class="w" id="mwBFE"> </span><span class="p" id="mwBFI">{</span> <span class="w" id="mwBFM"> </span><span class="n" id="mwBFQ">observers</span><span class="p" id="mwBFU">.</span><span class="n" id="mwBFY">remove_if</span><span class="p" id="mwBFc">([</span><span class="o" id="mwBFg">&</span><span class="n" id="mwBFk">observer</span><span class="p" id="mwBFo">](</span><span class="k" id="mwBFs">const</span><span class="w" id="mwBFw"> </span><span class="n" id="mwBF0">RefObserver</span><span class="o" id="mwBF4">&</span><span class="w" id="mwBF8"> </span><span class="n" id="mwBGA">obj</span><span class="p" id="mwBGE">)</span><span class="w" id="mwBGI"> </span><span class="o" id="mwBGM">-></span><span class="w" id="mwBGQ"> </span><span class="kt" id="mwBGU">bool</span><span class="w" id="mwBGY"> </span><span class="p" id="mwBGc">{</span><span class="w" id="mwBGg"> </span> <span class="w" id="mwBGk"> </span><span class="k" id="mwBGo">return</span><span class="w" id="mwBGs"> </span><span class="o" id="mwBGw">&</span><span class="n" id="mwBG0">obj</span><span class="p" id="mwBG4">.</span><span class="n" id="mwBG8">get</span><span class="p" id="mwBHA">()</span><span class="w" id="mwBHE"> </span><span class="o" id="mwBHI">==</span><span class="w" id="mwBHM"> </span><span class="o" id="mwBHQ">&</span><span class="n" id="mwBHU">observer</span><span class="p" id="mwBHY">;</span><span class="w" id="mwBHc"> </span> <span class="w" id="mwBHg"> </span><span class="p" id="mwBHk">});</span> <span class="w" id="mwBHo"> </span><span class="p" id="mwBHs">}</span> <span class="p" id="mwBHw">};</span> <span class="c1" id="mwBH0">// Example of usage</span> <span class="k" id="mwBH4">class</span><span class="w" id="mwBH8"> </span><span class="nc" id="mwBIA">ConcreteObserver</span><span class="o" id="mwBIE">:</span><span class="w" id="mwBII"> </span><span class="k" id="mwBIM">public</span><span class="w" id="mwBIQ"> </span><span class="n" id="mwBIU">Observer</span><span class="w" id="mwBIY"> </span><span class="p" id="mwBIc">{</span> <span class="k" id="mwBIg">public</span><span class="o" id="mwBIk">:</span> <span class="w" id="mwBIo"> </span><span class="k" id="mwBIs">explicit</span><span class="w" id="mwBIw"> </span><span class="n" id="mwBI0">ConcreteObserver</span><span class="p" id="mwBI4">(</span><span class="n" id="mwBI8">Subject</span><span class="o" id="mwBJA">&</span><span class="w" id="mwBJE"> </span><span class="n" id="mwBJI">subj</span><span class="p" id="mwBJM">)</span><span class="o" id="mwBJQ">:</span><span class="w" id="mwBJU"> </span> <span class="w" id="mwBJY"> </span><span class="n" id="mwBJc">Observer</span><span class="p" id="mwBJg">(</span><span class="n" id="mwBJk">subj</span><span class="p" id="mwBJo">)</span><span class="w" id="mwBJs"> </span><span class="p" id="mwBJw">{}</span> <span class="w" id="mwBJ0"> </span> <span class="w" id="mwBJ4"> </span><span class="c1" id="mwBJ8">// Get notification</span> <span class="w" id="mwBKA"> </span><span class="kt" id="mwBKE">void</span><span class="w" id="mwBKI"> </span><span class="n" id="mwBKM">update</span><span class="p" id="mwBKQ">(</span><span class="n" id="mwBKU">Subject</span><span class="o" id="mwBKY">&</span><span class="p" id="mwBKc">)</span><span class="w" id="mwBKg"> </span><span class="k" id="mwBKk">const</span><span class="w" id="mwBKo"> </span><span class="k" id="mwBKs">override</span><span class="w" id="mwBKw"> </span><span class="p" id="mwBK0">{</span> <span class="w" id="mwBK4"> </span><span class="n" id="mwBK8">std</span><span class="o" id="mwBLA">::</span><span class="n" id="mwBLE">println</span><span class="p" id="mwBLI">(</span><span class="s" id="mwBLM">"Got a notification"</span><span class="p" id="mwBLQ">);</span> <span class="w" id="mwBLU"> </span><span class="p" id="mwBLY">}</span> <span class="p" id="mwBLc">};</span> <span class="kt" id="mwBLg">int</span><span class="w" id="mwBLk"> </span><span class="nf" id="mwBLo">main</span><span class="p" id="mwBLs">(</span><span class="kt" id="mwBLw">int</span><span class="w" id="mwBL0"> </span><span class="n" id="mwBL4">argc</span><span class="p" id="mwBL8">,</span><span class="w" id="mwBMA"> </span><span class="kt" id="mwBME">char</span><span class="o" id="mwBMI">*</span><span class="w" id="mwBMM"> </span><span class="n" id="mwBMQ">argv</span><span class="p" id="mwBMU">[])</span><span class="w" id="mwBMY"> </span><span class="p" id="mwBMc">{</span> <span class="w" id="mwBMg"> </span><span class="n" id="mwBMk">Subject</span><span class="w" id="mwBMo"> </span><span class="n" id="mwBMs">cs</span><span class="p" id="mwBMw">;</span> <span class="w" id="mwBM0"> </span><span class="n" id="mwBM4">ConcreteObserver</span><span class="w" id="mwBM8"> </span><span class="n" id="mwBNA">co1</span><span class="p" id="mwBNE">(</span><span class="n" id="mwBNI">cs</span><span class="p" id="mwBNM">);</span> <span class="w" id="mwBNQ"> </span><span class="n" id="mwBNU">ConcreteObserver</span><span class="w" id="mwBNY"> </span><span class="n" id="mwBNc">co2</span><span class="p" id="mwBNg">(</span><span class="n" id="mwBNk">cs</span><span class="p" id="mwBNo">);</span> <span class="w" id="mwBNs"> </span><span class="n" id="mwBNw">cs</span><span class="p" id="mwBN0">.</span><span class="n" id="mwBN4">notify</span><span class="p" id="mwBN8">();</span> <span class="p" id="mwBOA">}</span>The program output is:
<span id="mwBOQ"></span><span class="n" id="mwBOU">Got</span><span class="w" id="mwBOY"> </span><span class="n" id="mwBOc">a</span><span class="w" id="mwBOg"> </span><span class="n" id="mwBOk">notification</span> <span class="n" id="mwBOo">Got</span><span class="w" id="mwBOs"> </span><span class="n" id="mwBOw">a</span><span class="w" id="mwBO0"> </span><span class="n" id="mwBO4">notification</span>
Groovy
<span id="mwBPI"></span><span class="kd" id="mwBPM">class</span><span class="w" id="mwBPQ"> </span><span class="nc" id="mwBPU">EventSource</span><span class="w" id="mwBPY"> </span><span class="o" id="mwBPc">{</span> <span class="w" id="mwBPg"> </span><span class="kd" id="mwBPk">private</span><span class="w" id="mwBPo"> </span><span class="n" id="mwBPs">observers</span><span class="w" id="mwBPw"> </span><span class="o" id="mwBP0">=</span><span class="w" id="mwBP4"> </span><span class="o" id="mwBP8">[]</span> <span class="w" id="mwBQA"> </span><span class="kd" id="mwBQE">private</span><span class="w" id="mwBQI"> </span><span class="nf" id="mwBQM">notifyObservers</span><span class="o" id="mwBQQ">(</span><span class="n" id="mwBQU">String</span><span class="w" id="mwBQY"> </span><span class="n" id="mwBQc">event</span><span class="o" id="mwBQg">)</span><span class="w" id="mwBQk"> </span><span class="o" id="mwBQo">{</span> <span class="w" id="mwBQs"> </span><span class="n" id="mwBQw">observers</span><span class="o" id="mwBQ0">.</span><span class="na" id="mwBQ4">each</span><span class="w" id="mwBQ8"> </span><span class="o" id="mwBRA">{</span><span class="w" id="mwBRE"> </span><span class="n" id="mwBRI">it</span><span class="o" id="mwBRM">(</span><span class="n" id="mwBRQ">event</span><span class="o" id="mwBRU">)</span><span class="w" id="mwBRY"> </span><span class="o" id="mwBRc">}</span> <span class="w" id="mwBRg"> </span><span class="o" id="mwBRk">}</span> <span class="w" id="mwBRo"> </span><span class="kt" id="mwBRs">void</span><span class="w" id="mwBRw"> </span><span class="nf" id="mwBR0">addObserver</span><span class="o" id="mwBR4">(</span><span class="n" id="mwBR8">observer</span><span class="o" id="mwBSA">)</span><span class="w" id="mwBSE"> </span><span class="o" id="mwBSI">{</span> <span class="w" id="mwBSM"> </span><span class="n" id="mwBSQ">observers</span><span class="w" id="mwBSU"> </span><span class="o" id="mwBSY">+=</span><span class="w" id="mwBSc"> </span><span class="n" id="mwBSg">observer</span> <span class="w" id="mwBSk"> </span><span class="o" id="mwBSo">}</span> <span class="w" id="mwBSs"> </span><span class="kt" id="mwBSw">void</span><span class="w" id="mwBS0"> </span><span class="nf" id="mwBS4">scanSystemIn</span><span class="o" id="mwBS8">()</span><span class="w" id="mwBTA"> </span><span class="o" id="mwBTE">{</span> <span class="w" id="mwBTI"> </span><span class="n" id="mwBTM">var</span><span class="w" id="mwBTQ"> </span><span class="n" id="mwBTU">scanner</span><span class="w" id="mwBTY"> </span><span class="o" id="mwBTc">=</span><span class="w" id="mwBTg"> </span><span class="k" id="mwBTk">new</span><span class="w" id="mwBTo"> </span><span class="n" id="mwBTs">Scanner</span><span class="o" id="mwBTw">(</span><span class="n" id="mwBT0">System</span><span class="o" id="mwBT4">.</span><span class="na" id="mwBT8">in</span><span class="o" id="mwBUA">)</span> <span class="w" id="mwBUE"> </span><span class="k" id="mwBUI">while</span><span class="w" id="mwBUM"> </span><span class="o" id="mwBUQ">(</span><span class="n" id="mwBUU">scanner</span><span class="o" id="mwBUY">)</span><span class="w" id="mwBUc"> </span><span class="o" id="mwBUg">{</span> <span class="w" id="mwBUk"> </span><span class="n" id="mwBUo">var</span><span class="w" id="mwBUs"> </span><span class="n" id="mwBUw">line</span><span class="w" id="mwBU0"> </span><span class="o" id="mwBU4">=</span><span class="w" id="mwBU8"> </span><span class="n" id="mwBVA">scanner</span><span class="o" id="mwBVE">.</span><span class="na" id="mwBVI">nextLine</span><span class="o" id="mwBVM">()</span> <span class="w" id="mwBVQ"> </span><span class="n" id="mwBVU">notifyObservers</span><span class="o" id="mwBVY">(</span><span class="n" id="mwBVc">line</span><span class="o" id="mwBVg">)</span> <span class="w" id="mwBVk"> </span><span class="o" id="mwBVo">}</span> <span class="w" id="mwBVs"> </span><span class="o" id="mwBVw">}</span> <span class="o" id="mwBV0">}</span> <span class="n" id="mwBV4">println</span><span class="w" id="mwBV8"> </span><span class="s1" id="mwBWA">'Enter Text: '</span> <span class="n" id="mwBWE">var</span><span class="w" id="mwBWI"> </span><span class="n" id="mwBWM">eventSource</span><span class="w" id="mwBWQ"> </span><span class="o" id="mwBWU">=</span><span class="w" id="mwBWY"> </span><span class="k" id="mwBWc">new</span><span class="w" id="mwBWg"> </span><span class="n" id="mwBWk">EventSource</span><span class="o" id="mwBWo">()</span> <span class="n" id="mwBWs">eventSource</span><span class="o" id="mwBWw">.</span><span class="na" id="mwBW0">addObserver</span><span class="w" id="mwBW4"> </span><span class="o" id="mwBW8">{</span><span class="w" id="mwBXA"> </span><span class="n" id="mwBXE">event</span><span class="w" id="mwBXI"> </span><span class="o" id="mwBXM">-></span> <span class="w" id="mwBXQ"> </span><span class="n" id="mwBXU">println</span><span class="w" id="mwBXY"> </span><span class="s2" id="mwBXc">"Received response: $event"</span> <span class="o" id="mwBXg">}</span> <span class="n" id="mwBXk">eventSource</span><span class="o" id="mwBXo">.</span><span class="na" id="mwBXs">scanSystemIn</span><span class="o" id="mwBXw">()</span>Kotlin
<span id="mwBYA"></span><span class="k" id="mwBYE">import</span><span class="w" id="mwBYI"> </span><span class="nn" id="mwBYM">java.util.Scanner</span> <span class="k" id="mwBYQ">typealias</span><span class="w" id="mwBYU"> </span><span class="n" id="mwBYY">Observer</span><span class="w" id="mwBYc"> </span><span class="o" id="mwBYg">=</span><span class="w" id="mwBYk"> </span><span class="p" id="mwBYo">(</span><span class="n" id="mwBYs">event</span><span class="p" id="mwBYw">:</span><span class="w" id="mwBY0"> </span><span class="kt" id="mwBY4">String</span><span class="p" id="mwBY8">)</span><span class="w" id="mwBZA"> </span><span class="o" id="mwBZE">-></span><span class="w" id="mwBZI"> </span><span class="kt" id="mwBZM">Unit</span><span class="p" id="mwBZQ">;</span> <span class="kd" id="mwBZU">class</span><span class="w" id="mwBZY"> </span><span class="nc" id="mwBZc">EventSource</span><span class="w" id="mwBZg"> </span><span class="p" id="mwBZk">{</span> <span class="w" id="mwBZo"> </span><span class="kd" id="mwBZs">private</span><span class="w" id="mwBZw"> </span><span class="kd" id="mwBZ0">var</span><span class="w" id="mwBZ4"> </span><span class="nv" id="mwBZ8">observers</span><span class="w" id="mwBaA"> </span><span class="o" id="mwBaE">=</span><span class="w" id="mwBaI"> </span><span class="n" id="mwBaM">mutableListOf</span><span class="o" id="mwBaQ"><</span><span class="n" id="mwBaU">Observer</span><span class="o" id="mwBaY">></span><span class="p" id="mwBac">()</span> <span class="w" id="mwBag"> </span><span class="kd" id="mwBak">private</span><span class="w" id="mwBao"> </span><span class="kd" id="mwBas">fun</span><span class="w" id="mwBaw"> </span><span class="nf" id="mwBa0">notifyObservers</span><span class="p" id="mwBa4">(</span><span class="n" id="mwBa8">event</span><span class="p" id="mwBbA">:</span><span class="w" id="mwBbE"> </span><span class="kt" id="mwBbI">String</span><span class="p" id="mwBbM">)</span><span class="w" id="mwBbQ"> </span><span class="p" id="mwBbU">{</span> <span class="w" id="mwBbY"> </span><span class="n" id="mwBbc">observers</span><span class="p" id="mwBbg">.</span><span class="na" id="mwBbk">forEach</span><span class="w" id="mwBbo"> </span><span class="p" id="mwBbs">{</span><span class="w" id="mwBbw"> </span><span class="nb" id="mwBb0">it</span><span class="p" id="mwBb4">(</span><span class="n" id="mwBb8">event</span><span class="p" id="mwBcA">)</span><span class="w" id="mwBcE"> </span><span class="p" id="mwBcI">}</span> <span class="w" id="mwBcM"> </span><span class="p" id="mwBcQ">}</span> <span class="w" id="mwBcU"> </span><span class="kd" id="mwBcY">fun</span><span class="w" id="mwBcc"> </span><span class="nf" id="mwBcg">addObserver</span><span class="p" id="mwBck">(</span><span class="n" id="mwBco">observer</span><span class="p" id="mwBcs">:</span><span class="w" id="mwBcw"> </span><span class="n" id="mwBc0">Observer</span><span class="p" id="mwBc4">)</span><span class="w" id="mwBc8"> </span><span class="p" id="mwBdA">{</span> <span class="w" id="mwBdE"> </span><span class="n" id="mwBdI">observers</span><span class="w" id="mwBdM"> </span><span class="o" id="mwBdQ">+=</span><span class="w" id="mwBdU"> </span><span class="n" id="mwBdY">observer</span> <span class="w" id="mwBdc"> </span><span class="p" id="mwBdg">}</span> <span class="w" id="mwBdk"> </span><span class="kd" id="mwBdo">fun</span><span class="w" id="mwBds"> </span><span class="nf" id="mwBdw">scanSystemIn</span><span class="p" id="mwBd0">()</span><span class="w" id="mwBd4"> </span><span class="p" id="mwBd8">{</span> <span class="w" id="mwBeA"> </span><span class="kd" id="mwBeE">val</span><span class="w" id="mwBeI"> </span><span class="nv" id="mwBeM">scanner</span><span class="w" id="mwBeQ"> </span><span class="o" id="mwBeU">=</span><span class="w" id="mwBeY"> </span><span class="n" id="mwBec">Scanner</span><span class="p" id="mwBeg">(</span><span class="n" id="mwBek">System</span><span class="p" id="mwBeo">.</span><span class="n" id="mwBes">`in`</span><span class="p" id="mwBew">)</span> <span class="w" id="mwBe0"> </span><span class="k" id="mwBe4">while</span><span class="w" id="mwBe8"> </span><span class="p" id="mwBfA">(</span><span class="n" id="mwBfE">scanner</span><span class="p" id="mwBfI">.</span><span class="na" id="mwBfM">hasNext</span><span class="p" id="mwBfQ">())</span><span class="w" id="mwBfU"> </span><span class="p" id="mwBfY">{</span> <span class="w" id="mwBfc"> </span><span class="kd" id="mwBfg">val</span><span class="w" id="mwBfk"> </span><span class="nv" id="mwBfo">line</span><span class="w" id="mwBfs"> </span><span class="o" id="mwBfw">=</span><span class="w" id="mwBf0"> </span><span class="n" id="mwBf4">scanner</span><span class="p" id="mwBf8">.</span><span class="na" id="mwBgA">nextLine</span><span class="p" id="mwBgE">()</span> <span class="w" id="mwBgI"> </span><span class="n" id="mwBgM">notifyObservers</span><span class="p" id="mwBgQ">(</span><span class="n" id="mwBgU">line</span><span class="p" id="mwBgY">)</span> <span class="w" id="mwBgc"> </span><span class="p" id="mwBgg">}</span> <span class="w" id="mwBgk"> </span><span class="p" id="mwBgo">}</span> <span class="p" id="mwBgs">}</span><span id="mwBg4"></span><span class="kd" id="mwBg8">fun</span><span class="w" id="mwBhA"> </span><span class="nf" id="mwBhE">main</span><span class="p" id="mwBhI">(</span><span class="n" id="mwBhM">arg</span><span class="p" id="mwBhQ">:</span><span class="w" id="mwBhU"> </span><span class="n" id="mwBhY">List</span><span class="o" id="mwBhc"><</span><span class="kt" id="mwBhg">String</span><span class="o" id="mwBhk">></span><span class="p" id="mwBho">)</span><span class="w" id="mwBhs"> </span><span class="p" id="mwBhw">{</span> <span class="w" id="mwBh0"> </span><span class="n" id="mwBh4">println</span><span class="p" id="mwBh8">(</span><span class="s" id="mwBiA">"Enter Text: "</span><span class="p" id="mwBiE">)</span> <span class="w" id="mwBiI"> </span><span class="kd" id="mwBiM">val</span><span class="w" id="mwBiQ"> </span><span class="nv" id="mwBiU">eventSource</span><span class="w" id="mwBiY"> </span><span class="o" id="mwBic">=</span><span class="w" id="mwBig"> </span><span class="n" id="mwBik">EventSource</span><span class="p" id="mwBio">()</span> <span class="w" id="mwBis"> </span><span class="n" id="mwBiw">eventSource</span><span class="p" id="mwBi0">.</span><span class="na" id="mwBi4">addObserver</span><span class="w" id="mwBi8"> </span><span class="p" id="mwBjA">{</span><span class="w" id="mwBjE"> </span><span class="n" id="mwBjI">event</span><span class="w" id="mwBjM"> </span><span class="o" id="mwBjQ">-></span> <span class="w" id="mwBjU"> </span><span class="n" id="mwBjY">println</span><span class="p" id="mwBjc">(</span><span class="s" id="mwBjg">"Received response: </span><span class="si" id="mwBjk">$</span><span class="n" id="mwBjo">event</span><span class="s" id="mwBjs">"</span><span class="p" id="mwBjw">)</span> <span class="w" id="mwBj0"> </span><span class="p" id="mwBj4">}</span> <span class="w" id="mwBj8"> </span><span class="n" id="mwBkA">eventSource</span><span class="p" id="mwBkE">.</span><span class="na" id="mwBkI">scanSystemIn</span><span class="p" id="mwBkM">()</span> <span class="p" id="mwBkQ">}</span>Delphi
<span id="mwBkg"></span><span class="k" id="mwBkk">uses</span> <span class="w" id="mwBko"> </span><span class="n" id="mwBks">System</span><span class="o" id="mwBkw">.</span><span class="n" id="mwBk0">Generics</span><span class="o" id="mwBk4">.</span><span class="n" id="mwBk8">Collections</span><span class="o" id="mwBlA">,</span><span class="w" id="mwBlE"> </span><span class="n" id="mwBlI">System</span><span class="o" id="mwBlM">.</span><span class="n" id="mwBlQ">SysUtils</span><span class="o" id="mwBlU">;</span> <span class="k" id="mwBlY">type</span> <span class="w" id="mwBlc"> </span><span class="n" id="mwBlg">IObserver</span><span class="w" id="mwBlk"> </span><span class="o" id="mwBlo">=</span><span class="w" id="mwBls"> </span><span class="k" id="mwBlw">interface</span> <span class="w" id="mwBl0"> </span><span class="p" id="mwBl4">[</span><span class="s" id="mwBl8">'{0C8F4C5D-1898-4F24-91DA-63F1DD66A692}'</span><span class="p" id="mwBmA">]</span> <span class="w" id="mwBmE"> </span><span class="k" id="mwBmI">procedure</span><span class="w" id="mwBmM"> </span><span class="nf" id="mwBmQ">Update</span><span class="p" id="mwBmU">(</span><span class="k" id="mwBmY">const</span><span class="w" id="mwBmc"> </span><span class="n" id="mwBmg">AValue</span><span class="o" id="mwBmk">:</span><span class="w" id="mwBmo"> </span><span class="k" id="mwBms">string</span><span class="p" id="mwBmw">)</span><span class="o" id="mwBm0">;</span> <span class="w" id="mwBm4"> </span><span class="k" id="mwBm8">end</span><span class="o" id="mwBnA">;</span> <span class="k" id="mwBnE">type</span> <span class="w" id="mwBnI"> </span><span class="n" id="mwBnM">TObserverManager</span><span class="w" id="mwBnQ"> </span><span class="o" id="mwBnU">=</span><span class="w" id="mwBnY"> </span><span class="k" id="mwBnc">class</span> <span class="w" id="mwBng"> </span><span class="kp" id="mwBnk">private</span> <span class="w" id="mwBno"> </span><span class="n" id="mwBns">FObservers</span><span class="o" id="mwBnw">:</span><span class="w" id="mwBn0"> </span><span class="n" id="mwBn4">TList</span><span class="o" id="mwBn8"><</span><span class="n" id="mwBoA">IObserver</span><span class="o" id="mwBoE">>;</span> <span class="w" id="mwBoI"> </span><span class="kp" id="mwBoM">public</span> <span class="w" id="mwBoQ"> </span><span class="k" id="mwBoU">constructor</span><span class="w" id="mwBoY"> </span><span class="nf" id="mwBoc">Create</span><span class="o" id="mwBog">;</span><span class="w" id="mwBok"> </span><span class="n" id="mwBoo">overload</span><span class="o" id="mwBos">;</span> <span class="w" id="mwBow"> </span><span class="k" id="mwBo0">destructor</span><span class="w" id="mwBo4"> </span><span class="nf" id="mwBo8">Destroy</span><span class="o" id="mwBpA">;</span><span class="w" id="mwBpE"> </span><span class="kp" id="mwBpI">override</span><span class="o" id="mwBpM">;</span> <span class="w" id="mwBpQ"> </span><span class="k" id="mwBpU">procedure</span><span class="w" id="mwBpY"> </span><span class="nf" id="mwBpc">NotifyObservers</span><span class="p" id="mwBpg">(</span><span class="k" id="mwBpk">const</span><span class="w" id="mwBpo"> </span><span class="n" id="mwBps">AValue</span><span class="o" id="mwBpw">:</span><span class="w" id="mwBp0"> </span><span class="k" id="mwBp4">string</span><span class="p" id="mwBp8">)</span><span class="o" id="mwBqA">;</span> <span class="w" id="mwBqE"> </span><span class="k" id="mwBqI">procedure</span><span class="w" id="mwBqM"> </span><span class="nf" id="mwBqQ">AddObserver</span><span class="p" id="mwBqU">(</span><span class="k" id="mwBqY">const</span><span class="w" id="mwBqc"> </span><span class="n" id="mwBqg">AObserver</span><span class="o" id="mwBqk">:</span><span class="w" id="mwBqo"> </span><span class="n" id="mwBqs">IObserver</span><span class="p" id="mwBqw">)</span><span class="o" id="mwBq0">;</span> <span class="w" id="mwBq4"> </span><span class="k" id="mwBq8">procedure</span><span class="w" id="mwBrA"> </span><span class="nf" id="mwBrE">UnregisterObserver</span><span class="p" id="mwBrI">(</span><span class="k" id="mwBrM">const</span><span class="w" id="mwBrQ"> </span><span class="n" id="mwBrU">AObserver</span><span class="o" id="mwBrY">:</span><span class="w" id="mwBrc"> </span><span class="n" id="mwBrg">IObserver</span><span class="p" id="mwBrk">)</span><span class="o" id="mwBro">;</span> <span class="w" id="mwBrs"> </span><span class="k" id="mwBrw">end</span><span class="o" id="mwBr0">;</span> <span class="k" id="mwBr4">type</span> <span class="w" id="mwBr8"> </span><span class="n" id="mwBsA">TListener</span><span class="w" id="mwBsE"> </span><span class="o" id="mwBsI">=</span><span class="w" id="mwBsM"> </span><span class="k" id="mwBsQ">class</span><span class="p" id="mwBsU">(</span><span class="n" id="mwBsY">TInterfacedObject</span><span class="o" id="mwBsc">,</span><span class="w" id="mwBsg"> </span><span class="n" id="mwBsk">IObserver</span><span class="p" id="mwBso">)</span> <span class="w" id="mwBss"> </span><span class="kp" id="mwBsw">private</span> <span class="w" id="mwBs0"> </span><span class="n" id="mwBs4">FName</span><span class="o" id="mwBs8">:</span><span class="w" id="mwBtA"> </span><span class="k" id="mwBtE">string</span><span class="o" id="mwBtI">;</span> <span class="w" id="mwBtM"> </span><span class="kp" id="mwBtQ">public</span> <span class="w" id="mwBtU"> </span><span class="k" id="mwBtY">constructor</span><span class="w" id="mwBtc"> </span><span class="nf" id="mwBtg">Create</span><span class="p" id="mwBtk">(</span><span class="k" id="mwBto">const</span><span class="w" id="mwBts"> </span><span class="n" id="mwBtw">AName</span><span class="o" id="mwBt0">:</span><span class="w" id="mwBt4"> </span><span class="k" id="mwBt8">string</span><span class="p" id="mwBuA">)</span><span class="o" id="mwBuE">;</span><span class="w" id="mwBuI"> </span><span class="k" id="mwBuM">reintroduce</span><span class="o" id="mwBuQ">;</span> <span class="w" id="mwBuU"> </span><span class="k" id="mwBuY">procedure</span><span class="w" id="mwBuc"> </span><span class="nf" id="mwBug">Update</span><span class="p" id="mwBuk">(</span><span class="k" id="mwBuo">const</span><span class="w" id="mwBus"> </span><span class="n" id="mwBuw">AValue</span><span class="o" id="mwBu0">:</span><span class="w" id="mwBu4"> </span><span class="k" id="mwBu8">string</span><span class="p" id="mwBvA">)</span><span class="o" id="mwBvE">;</span> <span class="w" id="mwBvI"> </span><span class="k" id="mwBvM">end</span><span class="o" id="mwBvQ">;</span> <span class="k" id="mwBvU">procedure</span><span class="w" id="mwBvY"> </span><span class="nc" id="mwBvc">TObserverManager</span><span class="o" id="mwBvg">.</span><span class="nf" id="mwBvk">AddObserver</span><span class="p" id="mwBvo">(</span><span class="k" id="mwBvs">const</span><span class="w" id="mwBvw"> </span><span class="n" id="mwBv0">AObserver</span><span class="o" id="mwBv4">:</span><span class="w" id="mwBv8"> </span><span class="n" id="mwBwA">IObserver</span><span class="p" id="mwBwE">)</span><span class="o" id="mwBwI">;</span> <span class="k" id="mwBwM">begin</span> <span class="w" id="mwBwQ"> </span><span class="k" id="mwBwU">if</span><span class="w" id="mwBwY"> </span><span class="k" id="mwBwc">not</span><span class="w" id="mwBwg"> </span><span class="n" id="mwBwk">FObservers</span><span class="o" id="mwBwo">.</span><span class="n" id="mwBws">Contains</span><span class="p" id="mwBww">(</span><span class="n" id="mwBw0">AObserver</span><span class="p" id="mwBw4">)</span> <span class="w" id="mwBw8"> </span><span class="k" id="mwBxA">then</span><span class="w" id="mwBxE"> </span><span class="n" id="mwBxI">FObservers</span><span class="o" id="mwBxM">.</span><span class="n" id="mwBxQ">Add</span><span class="p" id="mwBxU">(</span><span class="n" id="mwBxY">AObserver</span><span class="p" id="mwBxc">)</span><span class="o" id="mwBxg">;</span> <span class="k" id="mwBxk">end</span><span class="o" id="mwBxo">;</span> <span class="k" id="mwBxs">begin</span> <span class="w" id="mwBxw"> </span><span class="nb" id="mwBx0">FreeAndNil</span><span class="p" id="mwBx4">(</span><span class="n" id="mwBx8">FObservers</span><span class="p" id="mwByA">)</span><span class="o" id="mwByE">;</span> <span class="w" id="mwByI"> </span><span class="k" id="mwByM">inherited</span><span class="o" id="mwByQ">;</span> <span class="k" id="mwByU">end</span><span class="o" id="mwByY">;</span> <span class="k" id="mwByc">procedure</span><span class="w" id="mwByg"> </span><span class="nc" id="mwByk">TObserverManager</span><span class="o" id="mwByo">.</span><span class="nf" id="mwBys">NotifyObservers</span><span class="p" id="mwByw">(</span><span class="k" id="mwBy0">const</span><span class="w" id="mwBy4"> </span><span class="n" id="mwBy8">AValue</span><span class="o" id="mwBzA">:</span><span class="w" id="mwBzE"> </span><span class="k" id="mwBzI">string</span><span class="p" id="mwBzM">)</span><span class="o" id="mwBzQ">;</span> <span class="k" id="mwBzU">var</span> <span class="w" id="mwBzY"> </span><span class="n" id="mwBzc">i</span><span class="o" id="mwBzg">:</span><span class="w" id="mwBzk"> </span><span class="kt" id="mwBzo">Integer</span><span class="o" id="mwBzs">;</span> <span class="k" id="mwBzw">begin</span> <span class="w" id="mwBz0"> </span><span class="k" id="mwBz4">for</span><span class="w" id="mwBz8"> </span><span class="n" id="mwB0A">i</span><span class="w" id="mwB0E"> </span><span class="o" id="mwB0I">:=</span><span class="w" id="mwB0M"> </span><span class="mi" id="mwB0Q">0</span><span class="w" id="mwB0U"> </span><span class="k" id="mwB0Y">to</span><span class="w" id="mwB0c"> </span><span class="n" id="mwB0g">FObservers</span><span class="o" id="mwB0k">.</span><span class="n" id="mwB0o">Count</span><span class="w" id="mwB0s"> </span><span class="o" id="mwB0w">-</span><span class="w" id="mwB00"> </span><span class="mi" id="mwB04">1</span><span class="w" id="mwB08"> </span><span class="k" id="mwB1A">do</span> <span class="w" id="mwB1E"> </span><span class="n" id="mwB1I">FObservers</span><span class="p" id="mwB1M">[</span><span class="n" id="mwB1Q">i</span><span class="p" id="mwB1U">]</span><span class="o" id="mwB1Y">.</span><span class="n" id="mwB1c">Update</span><span class="p" id="mwB1g">(</span><span class="n" id="mwB1k">AValue</span><span class="p" id="mwB1o">)</span><span class="o" id="mwB1s">;</span> <span class="k" id="mwB1w">end</span><span class="o" id="mwB10">;</span> <span class="k" id="mwB14">procedure</span><span class="w" id="mwB18"> </span><span class="nc" id="mwB2A">TObserverManager</span><span class="o" id="mwB2E">.</span><span class="nf" id="mwB2I">UnregisterObserver</span><span class="p" id="mwB2M">(</span><span class="k" id="mwB2Q">const</span><span class="w" id="mwB2U"> </span><span class="n" id="mwB2Y">AObserver</span><span class="o" id="mwB2c">:</span><span class="w" id="mwB2g"> </span><span class="n" id="mwB2k">IObserver</span><span class="p" id="mwB2o">)</span><span class="o" id="mwB2s">;</span> <span class="k" id="mwB2w">begin</span> <span class="w" id="mwB20"> </span><span class="k" id="mwB24">if</span><span class="w" id="mwB28"> </span><span class="n" id="mwB3A">FObservers</span><span class="o" id="mwB3E">.</span><span class="n" id="mwB3I">Contains</span><span class="p" id="mwB3M">(</span><span class="n" id="mwB3Q">AObserver</span><span class="p" id="mwB3U">)</span> <span class="w" id="mwB3Y"> </span><span class="k" id="mwB3c">then</span><span class="w" id="mwB3g"> </span><span class="n" id="mwB3k">FObservers</span><span class="o" id="mwB3o">.</span><span class="n" id="mwB3s">Remove</span><span class="p" id="mwB3w">(</span><span class="n" id="mwB30">AObserver</span><span class="p" id="mwB34">)</span><span class="o" id="mwB38">;</span> <span class="k" id="mwB4A">end</span><span class="o" id="mwB4E">;</span> <span class="k" id="mwB4I">constructor</span><span class="w" id="mwB4M"> </span><span class="nc" id="mwB4Q">TListener</span><span class="o" id="mwB4U">.</span><span class="nf" id="mwB4Y">Create</span><span class="p" id="mwB4c">(</span><span class="k" id="mwB4g">const</span><span class="w" id="mwB4k"> </span><span class="n" id="mwB4o">AName</span><span class="o" id="mwB4s">:</span><span class="w" id="mwB4w"> </span><span class="k" id="mwB40">string</span><span class="p" id="mwB44">)</span><span class="o" id="mwB48">;</span> <span class="k" id="mwB5A">begin</span> <span class="w" id="mwB5E"> </span><span class="k" id="mwB5I">inherited</span><span class="w" id="mwB5M"> </span><span class="n" id="mwB5Q">Create</span><span class="o" id="mwB5U">;</span> <span class="w" id="mwB5Y"> </span><span class="n" id="mwB5c">FName</span><span class="w" id="mwB5g"> </span><span class="o" id="mwB5k">:=</span><span class="w" id="mwB5o"> </span><span class="n" id="mwB5s">AName</span><span class="o" id="mwB5w">;</span> <span class="k" id="mwB50">end</span><span class="o" id="mwB54">;</span> <span class="k" id="mwB58">procedure</span><span class="w" id="mwB6A"> </span><span class="nc" id="mwB6E">TListener</span><span class="o" id="mwB6I">.</span><span class="nf" id="mwB6M">Update</span><span class="p" id="mwB6Q">(</span><span class="k" id="mwB6U">const</span><span class="w" id="mwB6Y"> </span><span class="n" id="mwB6c">AValue</span><span class="o" id="mwB6g">:</span><span class="w" id="mwB6k"> </span><span class="k" id="mwB6o">string</span><span class="p" id="mwB6s">)</span><span class="o" id="mwB6w">;</span> <span class="k" id="mwB60">begin</span> <span class="w" id="mwB64"> </span><span class="nb" id="mwB68">WriteLn</span><span class="p" id="mwB7A">(</span><span class="n" id="mwB7E">FName</span><span class="w" id="mwB7I"> </span><span class="o" id="mwB7M">+</span><span class="w" id="mwB7Q"> </span><span class="s" id="mwB7U">' listener received notification: '</span><span class="w" id="mwB7Y"> </span><span class="o" id="mwB7c">+</span><span class="w" id="mwB7g"> </span><span class="n" id="mwB7k">AValue</span><span class="p" id="mwB7o">)</span><span class="o" id="mwB7s">;</span> <span class="k" id="mwB7w">end</span><span class="o" id="mwB70">;</span> <span class="k" id="mwB74">procedure</span><span class="w" id="mwB78"> </span><span class="nc" id="mwB8A">TMyForm</span><span class="o" id="mwB8E">.</span><span class="nf" id="mwB8I">ObserverExampleButtonClick</span><span class="p" id="mwB8M">(</span><span class="n" id="mwB8Q">Sender</span><span class="o" id="mwB8U">:</span><span class="w" id="mwB8Y"> </span><span class="kt" id="mwB8c">TObject</span><span class="p" id="mwB8g">)</span><span class="o" id="mwB8k">;</span> <span class="k" id="mwB8o">var</span> <span class="w" id="mwB8s"> </span><span class="n" id="mwB8w">LDoorNotify</span><span class="o" id="mwB80">:</span><span class="w" id="mwB84"> </span><span class="n" id="mwB88">TObserverManager</span><span class="o" id="mwB9A">;</span> <span class="w" id="mwB9E"> </span><span class="n" id="mwB9I">LListenerHusband</span><span class="o" id="mwB9M">:</span><span class="w" id="mwB9Q"> </span><span class="n" id="mwB9U">IObserver</span><span class="o" id="mwB9Y">;</span> <span class="w" id="mwB9c"> </span><span class="n" id="mwB9g">LListenerWife</span><span class="o" id="mwB9k">:</span><span class="w" id="mwB9o"> </span><span class="n" id="mwB9s">IObserver</span><span class="o" id="mwB9w">;</span> <span class="k" id="mwB90">begin</span> <span class="w" id="mwB94"> </span><span class="n" id="mwB98">LDoorNotify</span><span class="w" id="mwB-A"> </span><span class="o" id="mwB-E">:=</span><span class="w" id="mwB-I"> </span><span class="n" id="mwB-M">TObserverManager</span><span class="o" id="mwB-Q">.</span><span class="n" id="mwB-U">Create</span><span class="o" id="mwB-Y">;</span> <span class="w" id="mwB-c"> </span><span class="k" id="mwB-g">try</span> <span class="w" id="mwB-k"> </span><span class="n" id="mwB-o">LListenerHusband</span><span class="w" id="mwB-s"> </span><span class="o" id="mwB-w">:=</span><span class="w" id="mwB-0"> </span><span class="n" id="mwB-4">TListener</span><span class="o" id="mwB-8">.</span><span class="n" id="mwB_A">Create</span><span class="p" id="mwB_E">(</span><span class="s" id="mwB_I">'Husband'</span><span class="p" id="mwB_M">)</span><span class="o" id="mwB_Q">;</span> <span class="w" id="mwB_U"> </span><span class="n" id="mwB_Y">LDoorNotify</span><span class="o" id="mwB_c">.</span><span class="n" id="mwB_g">AddObserver</span><span class="p" id="mwB_k">(</span><span class="n" id="mwB_o">LListenerHusband</span><span class="p" id="mwB_s">)</span><span class="o" id="mwB_w">;</span> <span class="w" id="mwB_0"> </span><span class="n" id="mwB_4">LListenerWife</span><span class="w" id="mwB_8"> </span><span class="o" id="mwCAA">:=</span><span class="w" id="mwCAE"> </span><span class="n" id="mwCAI">TListener</span><span class="o" id="mwCAM">.</span><span class="n" id="mwCAQ">Create</span><span class="p" id="mwCAU">(</span><span class="s" id="mwCAY">'Wife'</span><span class="p" id="mwCAc">)</span><span class="o" id="mwCAg">;</span> <span class="w" id="mwCAk"> </span><span class="n" id="mwCAo">LDoorNotify</span><span class="o" id="mwCAs">.</span><span class="n" id="mwCAw">AddObserver</span><span class="p" id="mwCA0">(</span><span class="n" id="mwCA4">LListenerWife</span><span class="p" id="mwCA8">)</span><span class="o" id="mwCBA">;</span> <span class="w" id="mwCBE"> </span><span class="n" id="mwCBI">LDoorNotify</span><span class="o" id="mwCBM">.</span><span class="n" id="mwCBQ">NotifyObservers</span><span class="p" id="mwCBU">(</span><span class="s" id="mwCBY">'Someone is knocking on the door'</span><span class="p" id="mwCBc">)</span><span class="o" id="mwCBg">;</span> <span class="w" id="mwCBk"> </span><span class="k" id="mwCBo">finally</span> <span class="w" id="mwCBs"> </span><span class="nb" id="mwCBw">FreeAndNil</span><span class="p" id="mwCB0">(</span><span class="n" id="mwCB4">LDoorNotify</span><span class="p" id="mwCB8">)</span><span class="o" id="mwCCA">;</span> <span class="w" id="mwCCE"> </span><span class="k" id="mwCCI">end</span><span class="o" id="mwCCM">;</span> <span class="k" id="mwCCQ">end</span><span class="o" id="mwCCU">;</span>Output
Husband listener received notification: Someone is knocking on the door Wife listener received notification: Someone is knocking on the door
Python
A similar example in Python:
<span id="mwCC0"></span><span class="kn" id="mwCC4">from</span><span class="w" id="mwCC8"> </span><span class="nn" id="mwCDA">typing</span><span class="w" id="mwCDE"> </span><span class="kn" id="mwCDI">import</span> <span class="n" id="mwCDM">Any</span> <span class="k" id="mwCDQ">class</span><span class="w" id="mwCDU"> </span><span class="nc" id="mwCDY">Subject</span><span class="p" id="mwCDc">:</span> <span class="n" id="mwCDg">_observers</span><span class="p" id="mwCDk">:</span> <span class="nb" id="mwCDo">list</span><span class="p" id="mwCDs">[</span><span class="n" id="mwCDw">Observer</span><span class="p" id="mwCD0">]</span> <span class="k" id="mwCD4">def</span><span class="w" id="mwCD8"> </span><span class="fm" id="mwCEA">__init__</span><span class="p" id="mwCEE">(</span><span class="bp" id="mwCEI">self</span><span class="p" id="mwCEM">)</span> <span class="o" id="mwCEQ">-></span> <span class="kc" id="mwCEU">None</span><span class="p" id="mwCEY">:</span> <span class="bp" id="mwCEc">self</span><span class="o" id="mwCEg">.</span><span class="n" id="mwCEk">_observers</span> <span class="o" id="mwCEo">=</span> <span class="p" id="mwCEs">[]</span> <span class="k" id="mwCEw">def</span><span class="w" id="mwCE0"> </span><span class="nf" id="mwCE4">register_observer</span><span class="p" id="mwCE8">(</span><span class="bp" id="mwCFA">self</span><span class="p" id="mwCFE">,</span> <span class="n" id="mwCFI">observer</span><span class="p" id="mwCFM">:</span> <span class="n" id="mwCFQ">Observer</span><span class="p" id="mwCFU">)</span> <span class="o" id="mwCFY">-></span> <span class="kc" id="mwCFc">None</span><span class="p" id="mwCFg">:</span> <span class="bp" id="mwCFk">self</span><span class="o" id="mwCFo">.</span><span class="n" id="mwCFs">_observers</span><span class="o" id="mwCFw">.</span><span class="n" id="mwCF0">append</span><span class="p" id="mwCF4">(</span><span class="n" id="mwCF8">observer</span><span class="p" id="mwCGA">)</span> <span class="k" id="mwCGE">def</span><span class="w" id="mwCGI"> </span><span class="nf" id="mwCGM">notify_observers</span><span class="p" id="mwCGQ">(</span><span class="bp" id="mwCGU">self</span><span class="p" id="mwCGY">,</span> <span class="o" id="mwCGc">*</span><span class="n" id="mwCGg">args</span><span class="p" id="mwCGk">:</span> <span class="nb" id="mwCGo">tuple</span><span class="p" id="mwCGs">[</span><span class="n" id="mwCGw">Any</span><span class="p" id="mwCG0">,</span> <span class="o" id="mwCG4">...</span><span class="p" id="mwCG8">],</span> <span class="o" id="mwCHA">**</span><span class="n" id="mwCHE">kwargs</span><span class="p" id="mwCHI">:</span> <span class="nb" id="mwCHM">dict</span><span class="p" id="mwCHQ">[</span><span class="nb" id="mwCHU">str</span><span class="p" id="mwCHY">,</span> <span class="n" id="mwCHc">Any</span><span class="p" id="mwCHg">])</span> <span class="o" id="mwCHk">-></span> <span class="kc" id="mwCHo">None</span><span class="p" id="mwCHs">:</span> <span class="k" id="mwCHw">for</span> <span class="n" id="mwCH0">observer</span> <span class="ow" id="mwCH4">in</span> <span class="bp" id="mwCH8">self</span><span class="o" id="mwCIA">.</span><span class="n" id="mwCIE">_observers</span><span class="p" id="mwCII">:</span> <span class="n" id="mwCIM">observer</span><span class="o" id="mwCIQ">.</span><span class="n" id="mwCIU">notify</span><span class="p" id="mwCIY">(</span><span class="bp" id="mwCIc">self</span><span class="p" id="mwCIg">,</span> <span class="o" id="mwCIk">*</span><span class="n" id="mwCIo">args</span><span class="p" id="mwCIs">,</span> <span class="o" id="mwCIw">**</span><span class="n" id="mwCI0">kwargs</span><span class="p" id="mwCI4">)</span> <span class="k" id="mwCI8">class</span><span class="w" id="mwCJA"> </span><span class="nc" id="mwCJE">Observer</span><span class="p" id="mwCJI">:</span> <span class="k" id="mwCJM">def</span><span class="w" id="mwCJQ"> </span><span class="fm" id="mwCJU">__init__</span><span class="p" id="mwCJY">(</span><span class="bp" id="mwCJc">self</span><span class="p" id="mwCJg">,</span> <span class="n" id="mwCJk">subject</span><span class="p" id="mwCJo">:</span> <span class="n" id="mwCJs">Subject</span><span class="p" id="mwCJw">)</span> <span class="o" id="mwCJ0">-></span> <span class="kc" id="mwCJ4">None</span><span class="p" id="mwCJ8">:</span> <span class="n" id="mwCKA">subject</span><span class="o" id="mwCKE">.</span><span class="n" id="mwCKI">register_observer</span><span class="p" id="mwCKM">(</span><span class="bp" id="mwCKQ">self</span><span class="p" id="mwCKU">)</span> <span class="k" id="mwCKY">def</span><span class="w" id="mwCKc"> </span><span class="nf" id="mwCKg">notify</span><span class="p" id="mwCKk">(</span><span class="bp" id="mwCKo">self</span><span class="p" id="mwCKs">,</span> <span class="n" id="mwCKw">subject</span><span class="p" id="mwCK0">:</span> <span class="n" id="mwCK4">Subject</span><span class="p" id="mwCK8">,</span> <span class="o" id="mwCLA">*</span><span class="n" id="mwCLE">args</span><span class="p" id="mwCLI">:</span> <span class="nb" id="mwCLM">tuple</span><span class="p" id="mwCLQ">[</span><span class="n" id="mwCLU">Any</span><span class="p" id="mwCLY">,</span> <span class="o" id="mwCLc">...</span><span class="p" id="mwCLg">],</span> <span class="o" id="mwCLk">**</span><span class="n" id="mwCLo">kwargs</span><span class="p" id="mwCLs">:</span> <span class="nb" id="mwCLw">dict</span><span class="p" id="mwCL0">[</span><span class="nb" id="mwCL4">str</span><span class="p" id="mwCL8">,</span> <span class="n" id="mwCMA">Any</span><span class="p" id="mwCME">])</span> <span class="o" id="mwCMI">-></span> <span class="kc" id="mwCMM">None</span><span class="p" id="mwCMQ">:</span> <span class="nb" id="mwCMU">print</span><span class="p" id="mwCMY">(</span><span class="sa" id="mwCMc">f</span><span class="s2" id="mwCMg">"Got </span><span class="si" id="mwCMk">{</span><span class="n" id="mwCMo">args</span><span class="si" id="mwCMs">}</span><span class="s2" id="mwCMw">, </span><span class="si" id="mwCM0">{</span><span class="n" id="mwCM4">kwargs</span><span class="si" id="mwCM8">}</span><span class="s2" id="mwCNA"> from </span><span class="si" id="mwCNE">{</span><span class="n" id="mwCNI">subject</span><span class="si" id="mwCNM">}</span><span class="s2" id="mwCNQ">"</span><span class="p" id="mwCNU">)</span> <span class="n" id="mwCNY">subject</span><span class="p" id="mwCNc">:</span> <span class="n" id="mwCNg">Subject</span> <span class="o" id="mwCNk">=</span> <span class="n" id="mwCNo">Subject</span><span class="p" id="mwCNs">()</span> <span class="n" id="mwCNw">observer</span><span class="p" id="mwCN0">:</span> <span class="n" id="mwCN4">Observer</span> <span class="o" id="mwCN8">=</span> <span class="n" id="mwCOA">Observer</span><span class="p" id="mwCOE">(</span><span class="n" id="mwCOI">subject</span><span class="p" id="mwCOM">)</span> <span class="n" id="mwCOQ">subject</span><span class="o" id="mwCOU">.</span><span class="n" id="mwCOY">notify_observers</span><span class="p" id="mwCOc">(</span><span class="s2" id="mwCOg">"test"</span><span class="p" id="mwCOk">,</span> <span class="n" id="mwCOo">kw</span><span class="o" id="mwCOs">=</span><span class="s2" id="mwCOw">"python"</span><span class="p" id="mwCO0">)</span> <span class="c1" id="mwCO4"># prints: Got ('test',) {'kw': 'python'} From <__main__.Observable object at 0x0000019757826FD0></span>JavaScript
JavaScript has a deprecated Object.observe function that was a more accurate implementation of the observer pattern. This would fire events upon change to the observed object. Without the deprecated Object.observe function, the pattern may be implemented with more explicit code:
<span id="mwCP0"></span><span class="kd" id="mwCP4">let</span><span class="w" id="mwCP8"> </span><span class="nx" id="mwCQA">Subject</span><span class="w" id="mwCQE"> </span><span class="o" id="mwCQI">=</span><span class="w" id="mwCQM"> </span><span class="p" id="mwCQQ">{</span> <span class="w" id="mwCQU"> </span><span class="nx" id="mwCQY">_state</span><span class="o" id="mwCQc">:</span><span class="w" id="mwCQg"> </span><span class="mf" id="mwCQk">0</span><span class="p" id="mwCQo">,</span> <span class="w" id="mwCQs"> </span><span class="nx" id="mwCQw">_observers</span><span class="o" id="mwCQ0">:</span><span class="w" id="mwCQ4"> </span><span class="p" id="mwCQ8">[],</span> <span class="w" id="mwCRA"> </span><span class="nx" id="mwCRE">add</span><span class="o" id="mwCRI">:</span><span class="w" id="mwCRM"> </span><span class="kd" id="mwCRQ">function</span><span class="p" id="mwCRU">(</span><span class="nx" id="mwCRY">observer</span><span class="p" id="mwCRc">)</span><span class="w" id="mwCRg"> </span><span class="p" id="mwCRk">{</span> <span class="w" id="mwCRo"> </span><span class="k" id="mwCRs">this</span><span class="p" id="mwCRw">.</span><span class="nx" id="mwCR0">_observers</span><span class="p" id="mwCR4">.</span><span class="nx" id="mwCR8">push</span><span class="p" id="mwCSA">(</span><span class="nx" id="mwCSE">observer</span><span class="p" id="mwCSI">);</span> <span class="w" id="mwCSM"> </span><span class="p" id="mwCSQ">},</span> <span class="w" id="mwCSU"> </span><span class="nx" id="mwCSY">getState</span><span class="o" id="mwCSc">:</span><span class="w" id="mwCSg"> </span><span class="kd" id="mwCSk">function</span><span class="p" id="mwCSo">()</span><span class="w" id="mwCSs"> </span><span class="p" id="mwCSw">{</span> <span class="w" id="mwCS0"> </span><span class="k" id="mwCS4">return</span><span class="w" id="mwCS8"> </span><span class="k" id="mwCTA">this</span><span class="p" id="mwCTE">.</span><span class="nx" id="mwCTI">_state</span><span class="p" id="mwCTM">;</span> <span class="w" id="mwCTQ"> </span><span class="p" id="mwCTU">},</span> <span class="w" id="mwCTY"> </span><span class="nx" id="mwCTc">setState</span><span class="o" id="mwCTg">:</span><span class="w" id="mwCTk"> </span><span class="kd" id="mwCTo">function</span><span class="p" id="mwCTs">(</span><span class="nx" id="mwCTw">value</span><span class="p" id="mwCT0">)</span><span class="w" id="mwCT4"> </span><span class="p" id="mwCT8">{</span> <span class="w" id="mwCUA"> </span><span class="k" id="mwCUE">this</span><span class="p" id="mwCUI">.</span><span class="nx" id="mwCUM">_state</span><span class="w" id="mwCUQ"> </span><span class="o" id="mwCUU">=</span><span class="w" id="mwCUY"> </span><span class="nx" id="mwCUc">value</span><span class="p" id="mwCUg">;</span> <span class="w" id="mwCUk"> </span><span class="k" id="mwCUo">for</span><span class="w" id="mwCUs"> </span><span class="p" id="mwCUw">(</span><span class="kd" id="mwCU0">let</span><span class="w" id="mwCU4"> </span><span class="nx" id="mwCU8">i</span><span class="w" id="mwCVA"> </span><span class="o" id="mwCVE">=</span><span class="w" id="mwCVI"> </span><span class="mf" id="mwCVM">0</span><span class="p" id="mwCVQ">;</span><span class="w" id="mwCVU"> </span><span class="nx" id="mwCVY">i</span><span class="w" id="mwCVc"> </span><span class="o" id="mwCVg"><</span><span class="w" id="mwCVk"> </span><span class="k" id="mwCVo">this</span><span class="p" id="mwCVs">.</span><span class="nx" id="mwCVw">_observers</span><span class="p" id="mwCV0">.</span><span class="nx" id="mwCV4">length</span><span class="p" id="mwCV8">;</span><span class="w" id="mwCWA"> </span><span class="nx" id="mwCWE">i</span><span class="o" id="mwCWI">++</span><span class="p" id="mwCWM">)</span> <span class="w" id="mwCWQ"> </span><span class="p" id="mwCWU">{</span> <span class="w" id="mwCWY"> </span><span class="k" id="mwCWc">this</span><span class="p" id="mwCWg">.</span><span class="nx" id="mwCWk">_observers</span><span class="p" id="mwCWo">[</span><span class="nx" id="mwCWs">i</span><span class="p" id="mwCWw">].</span><span class="nx" id="mwCW0">signal</span><span class="p" id="mwCW4">(</span><span class="k" id="mwCW8">this</span><span class="p" id="mwCXA">);</span> <span class="w" id="mwCXE"> </span><span class="p" id="mwCXI">}</span> <span class="w" id="mwCXM"> </span><span class="p" id="mwCXQ">}</span> <span class="p" id="mwCXU">};</span> <span class="kd" id="mwCXY">let</span><span class="w" id="mwCXc"> </span><span class="nx" id="mwCXg">Observer</span><span class="w" id="mwCXk"> </span><span class="o" id="mwCXo">=</span><span class="w" id="mwCXs"> </span><span class="p" id="mwCXw">{</span> <span class="w" id="mwCX0"> </span><span class="nx" id="mwCX4">signal</span><span class="o" id="mwCX8">:</span><span class="w" id="mwCYA"> </span><span class="kd" id="mwCYE">function</span><span class="p" id="mwCYI">(</span><span class="nx" id="mwCYM">subject</span><span class="p" id="mwCYQ">)</span><span class="w" id="mwCYU"> </span><span class="p" id="mwCYY">{</span> <span class="w" id="mwCYc"> </span><span class="kd" id="mwCYg">let</span><span class="w" id="mwCYk"> </span><span class="nx" id="mwCYo">currentValue</span><span class="w" id="mwCYs"> </span><span class="o" id="mwCYw">=</span><span class="w" id="mwCY0"> </span><span class="nx" id="mwCY4">subject</span><span class="p" id="mwCY8">.</span><span class="nx" id="mwCZA">getState</span><span class="p" id="mwCZE">();</span> <span class="w" id="mwCZI"> </span><span class="nx" id="mwCZM">console</span><span class="p" id="mwCZQ">.</span><span class="nx" id="mwCZU">log</span><span class="p" id="mwCZY">(</span><span class="nx" id="mwCZc">currentValue</span><span class="p" id="mwCZg">);</span> <span class="w" id="mwCZk"> </span><span class="p" id="mwCZo">}</span> <span class="p" id="mwCZs">}</span> <span class="nx" id="mwCZw">Subject</span><span class="p" id="mwCZ0">.</span><span class="nx" id="mwCZ4">add</span><span class="p" id="mwCZ8">(</span><span class="nx" id="mwCaA">Observer</span><span class="p" id="mwCaE">);</span> <span class="nx" id="mwCaI">Subject</span><span class="p" id="mwCaM">.</span><span class="nx" id="mwCaQ">setState</span><span class="p" id="mwCaU">(</span><span class="mf" id="mwCaY">10</span><span class="p" id="mwCac">);</span> <span class="c1" id="mwCag">// Output in console.log - 10</span>
