This tutorial is about observer pattern, which is my thoghts after watching the tutorial created by Christopher Okhravi.
IObserverable is something that is being observed by IObserver, where I represents interface.
IObserver wants to know if IObserverable has changed
Poll: IObserver keeps asking “Have you change?”every second.
Push: Instead of the above bad idea, IObservable pushes message automatically whenever its status has changed.
0.* means a IObservable may have many IObservers at the same time.
new ConcreteObserver(Concreteobservable instance): The red arrow shows that
ConcreteObserver can access ConcreteObservable instance whenever it calls Update() method.
IObserver portion:
1: public interface IObserver
2: {
3: void Update();
4: }
IObservable portion:
1: interface IObservable
2: {
3: void Add(IObserver o);
4: void Remove(IObserver o);
5: void Notify();
6: }
WeatherStation portion:
Since WeatherStation class inherits from IObservable, it needs to implement three methods, including Add(), Remove(), and Notify().
1: public class WeatherStation : IObservable
2: {
3: IList<IObserver> observers = new List<IObserver>();
4:
5: public void Add(IObserver o)
6: {
7: observers.Add(o);
8: }
9:
10: public void Notify()
11: {
12: foreach(IObserver o in observers)
13: {
14: o.Update();
15: }
16: }
17: public int GetTemperature()
18: {
19: Random rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
20: return rnd.Next(0, 30);
21: }
22: public void Remove(IObserver o)
23: {
24: observers.Remove(o);
25: }
26: }
PhoneDisplay portion:
1: public class PhoneDisplay : IObserver, IDisplay
2: {
3: WeatherStation station;
4: int temperature;
5: public PhoneDisplay(WeatherStation _station)
6: {
7: this.station = _station;
8: }
9:
10: public void Display()
11: {
12: Console.WriteLine("Current Temperature is {0} degrees Celsius", temperature);
13: }
14:
15: public void Update()
16: {
17: temperature = station.GetTemperature();
18: Display();
19: }
20: }
Client portion:
PhoneDisplay phone1 = new PhoneDisplay(station):
We pass station to PhoneDisplay constructor, because display somehow must be able to look at the weather station.
station.Add(phone1): The purpose of doing this is“Whenever Notify() is called, phone1 will receive the message from the station.”(Push instead of Poll)
1: static void Main(string[] args)
2: {
3: // One ConcreteObservable
4: WeatherStation station = new WeatherStation();
5:
6: // Two ConcreteObservers
7: PhoneDisplay phone1 = new PhoneDisplay(station);
8: PhoneDisplay phone2 = new PhoneDisplay(station);
9:
10: // ConcreteObservable adds two ConcreteObservers
11: station.Add(phone1);
12: station.Add(phone2);
13:
14: // Send message from ConcreteObservable
15: station.Notify();
16: Console.ReadKey();
17: }
留言列表