代码using System;
using System.Collections.Generic;
namespace DoFactory.GangOfFour.Observer.Structural
{
/// <summary>/// MainApp startup class for Structural/// Observer Design Pattern./// </summary>class MainApp
{
/// <summary>/// Entry point into console application./// </summary>staticvoid Main()
{
// Configure Observer pattern
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s, "X"));
s.Attach(new ConcreteObserver(s, "Y"));
s.Attach(new ConcreteObserver(s, "Z"));
// Change subject and notify observers
s.SubjectState = "ABC";
s.Notify();
// Wait for user
Console.ReadKey();
}
}
/// <summary>/// The 'Subject' abstract class/// </summary>abstractclass Subject
{
private List<Observer> _observers = new List<Observer>();
publicvoid Attach(Observer observer)
{
_observers.Add(observer);
}
publicvoid Detach(Observer observer)
{
_observers.Remove(observer);
}
publicvoid Notify()
{
foreach (Observer o in _observers)
{
o.Update();
}
}
}
/// <summary>/// The 'ConcreteSubject' class/// </summary>class ConcreteSubject : Subject
{
privatestring _subjectState;
// Gets or sets subject statepublicstring SubjectState
{
get { return _subjectState; }
set { _subjectState = value; }
}
}
/// <summary>/// The 'Observer' abstract class/// </summary>abstractclass Observer
{
publicabstractvoid Update();
}
/// <summary>/// The 'ConcreteObserver' class/// </summary>class ConcreteObserver : Observer
{
privatestring _name;
privatestring _observerState;
private ConcreteSubject _subject;
// Constructorpublic ConcreteObserver(
ConcreteSubject subject, string name)
{
this._subject = subject;
this._name = name;
}
publicoverridevoid Update()
{
_observerState = _subject.SubjectState;
Console.WriteLine("Observer {0}'s new state is {1}",
_name, _observerState);
}
// Gets or sets subjectpublic ConcreteSubject Subject
{
get { return _subject; }
set { _subject = value; }
}
}
}
output
Observer X's new state is ABC Observer Y's new state is ABC Observer Z's new state is ABC
实际运用
代码using System;
using System.Collections.Generic;
namespace DoFactory.GangOfFour.Observer.RealWorld
{
/// <summary>/// MainApp startup class for Real-World/// Observer Design Pattern./// </summary>class MainApp
{
/// <summary>/// Entry point into console application./// </summary>staticvoid Main()
{
// Create IBM stock and attach investors
IBM ibm = new IBM("IBM", 120.00);
ibm.Attach(new Investor("Sorros"));
ibm.Attach(new Investor("Berkshire"));
// Fluctuating prices will notify investors
ibm.Price = 120.10;
ibm.Price = 121.00;
ibm.Price = 120.50;
ibm.Price = 120.75;
// Wait for user
Console.ReadKey();
}
}
/// <summary>/// The 'Subject' abstract class/// </summary>abstractclass Stock
{
privatestring _symbol;
privatedouble _price;
private List<IInvestor> _investors = new List<IInvestor>();
// Constructorpublic Stock(string symbol, double price)
{
this._symbol = symbol;
this._price = price;
}
publicvoid Attach(IInvestor investor)
{
_investors.Add(investor);
}
publicvoid Detach(IInvestor investor)
{
_investors.Remove(investor);
}
publicvoid Notify()
{
foreach (IInvestor investor in _investors)
{
investor.Update(this);
}
Console.WriteLine("");
}
// Gets or sets the pricepublicdouble Price
{
get { return _price; }
set
{
if (_price != value)
{
_price = value;
Notify();
}
}
}
// Gets the symbolpublicstring Symbol
{
get { return _symbol; }
}
}
/// <summary>/// The 'ConcreteSubject' class/// </summary>class IBM : Stock
{
// Constructorpublic IBM(string symbol, double price)
: base(symbol, price)
{
}
}
/// <summary>/// The 'Observer' interface/// </summary>interface IInvestor
{
void Update(Stock stock);
}
/// <summary>/// The 'ConcreteObserver' class/// </summary>class Investor : IInvestor
{
privatestring _name;
private Stock _stock;
// Constructorpublic Investor(string name)
{
this._name = name;
}
publicvoid Update(Stock stock)
{
Console.WriteLine("Notified {0} of {1}'s " +
"change to {2:C}", _name, stock.Symbol, stock.Price);
}
// Gets or sets the stockpublic Stock Stock
{
get { return _stock; }
set { _stock = value; }
}
}
}
Output
Notified Sorros of IBM's change to $120.10 Notified Berkshire of IBM's change to $120.10 Notified Sorros of IBM's change to $121.00 Notified Berkshire of IBM's change to $121.00 Notified Sorros of IBM's change to $120.50 Notified Berkshire of IBM's change to $120.50 Notified Sorros of IBM's change to $120.75 Notified Berkshire of IBM's change to $120.75
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步