Definition
Define a one-to-man Dependency Between Objects So That When Object Changes State, All ITS Dependents Are Notified and Updated Automatically.
Frequency of use: high
UML Class Diagram
Participants the classes and / or ibjects participating in this pattern is:
Subject (Stock)
KNOWS ITS OBSERVERS. Any Number of Observer Objects May Observe A Subject Provides An Interface for Attaching and Detaching Observer Objects. ConcreteSubject (IBM)
Stores State of Interest to Concreteobserver Sends a Notification To Its Observers When ITS State Changes Observer (Iinvestor)
Defines An Updating Interface for Objects That Should Be Notified of Changes in A Subject. ConcreteobServer (Investor)
MAINTAINS A Reference To a concretessubject j j 帖 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子 帖子
Sample code in C #
This Structural Code Demonstrates The Observer Pattern in Which Registered Objects Are Notified of and Updated with a state change.
// Observer pattern - Structural example using System; using System.Collections; // "Subject" abstract class Subject {// Fields private ArrayList observers = new ArrayList (); // Methods public void Attach (Observer observer) {observers. Add (observer);} public void Detach (Observer observer) {observers.Remove (observer);} public void Notify () {foreach (Observer o in observers) o.Update ();}} // "ConcreteSubject" class ConcreteSubject : Subject {// Fields private string subjectState; // Properties public string subjectState {get {return subjectState;} set {subjectState = value;}}} // "Observer" abstract class Observer {// Methods abstract public void Update () ;} // "ConcreteObserver" class ConcreteObserver: Observer {// Fields private string name; private string observerState; private ConcreteSubject subject; // Constructors public ConcreteObserver (ConcreteSubject subject, string name) {this.su bject = subject; this.name = name;} // Methods override public void Update () {observerState = subject.SubjectState; Console.WriteLine ( "Observer {0} 's new state is {1}", name, observerState) } // Properties Public ConcreteSubject Subject {Get {Return Subject;} set {subject = value;}}} ///
s.Attach (new ConcreteObserver (s, "Z")); // Change subject and notify observers s.SubjectState = "ABC"; s.Notify ();}} OutputObserver X's new state is ABCObserver Y's new state is ABCObserver Z's New State IS ABC
This Real-World Code Demonstrates The Observer Pattern In Which Registered Investors Are Notified Every Time A stock changes value.
// Observer pattern - Real World example using System; using System.Collections; // "Subject" abstract class Stock {// Fields protected string symbol; protected double price; private ArrayList investors = new ArrayList (); // Constructor public Stock (string symbol, double price) {this.symbol = symbol; this.price = price;} // Methods public void Attach (Investor investor) {investors.Add (investor);} public void Detach (Investor investor) {investors .Remove (Investor);} public void notify () {Foreach (investeor) i.Update (this);} // Properties Public Double Price {get {return price;} set {price = value; notify () ;}} public string Symbol {get {return symbol;} set {symbol = value;}}} // "ConcreteSubject" class IBM: Stock {// Constructor public IBM (string symbol, double price): base (symbol, price ) {}} // "observer" interface Iinvestor {//Methods Void Update (Stock Stock Stock );} // "ConcreteObserver" class Investor: IInvestor {// Fields private string name; private string observerState; private Stock stock; // Constructors public Investor (string name) {this.name = name;} // Methods public void Update (stock stock) {console.writeline ("Notified Investor {0} of {1} 's" Change to {2: C} ", Name, stock.symbol, stock.price;} // Properties Public Stock Stock} set {stock = value;}}} ///
"); Investor b = new investeor (" Berkshire "); // Create IBM stock and attach investors IBM IBM = New IBM (" IBM ", 120.00); IBM.attach (s); IBM.attach (b); // Change price, which notifies investors ibm.Price = 120.10; ibm.Price = 121.00; ibm.Price = 120.50; ibm.Price = 120.75;}} OutputNotified investor Sorros of IBM's change to $ 120.10Notified investor Berkshire of IBM's change to $ 120.10 Notified investor Sorros of IBM's change to $ 121.00Notified investor Berkshire of IBM's change to $ 121.00Notified investor Sorros of IBM's change to $ 120.50Notified investor Berkshire of IBM's change to $ 120.50Notified investor Sorros of IBM's change to $ 120.75Notified investor Berkshire of IBM's change to $ 120.75