الگوی مشاهدهگر Observer Pattern
نویسنده: علی یگانه مقدم
تاریخ: ۱۳۹۵/۰۱/۱۴ ۲۰:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
یک لامپ و سوئیچ برق را درنظر بگیرید. زمانیکه لامپ مشاهده میکند سوئیچ برق در حالت روشن قرار گرفتهاست، روشن خواهد شد و برعکس. در اینجا به سوئیچ، subject و به لامپ، observer گفته میشود. هر زمان که حالت سوئیچ تغییر میکند، از طریق یک callback، وضعیت خود را به observer اعلام خواهد کرد. علت استفاده از callbackها، ارائه راهحلهای عمومی است تا بتواند با انواع و اقسام اشیاء کار کند. به این ترتیب هر بار که شیء observer از نوع متفاوتی تعریف میشود (مثلا بجای لامپ یک خودرو قرار گیرد)، نیازی نخواهد بود تا subject را تغییر داد.
public abstract class Observer
{
protected Observable Observable;
public abstract void Update();
} public class Observable
{
private readonly List<Observer> _observers = new List<Observer>();
public void Attach(Observer observer)
{
_observers.Add(observer);
}
public void Dettach(Observer observer)
{
_observers.Remove(observer);
}
public void NotifyAllObservers()
{
foreach (var observer in _observers)
{
observer.Update();
}
}
} public class Switch:Observable
{
private bool _state;
public bool ChangeState
{
set
{
_state = value;
NotifyAllObservers();
}
get { return _state; }
}
} public class RedLED:Observer
{
private bool _on = false;
public override void Update()
{
_on = !_on;
Console.WriteLine($"Red LED is {((_on) ? "On" : "Off")}");
}
} public class GreenLED:Observer
{
private bool _on = false;
public override void Update()
{
_on = !_on;
Console.WriteLine($"Green LED is {((_on) ? "On" : "Off")}");
}
} public class BlueLED:Observer
{
private bool _on = false;
public override void Update()
{
_on = !_on;
Console.WriteLine($"Blue LED is {((_on) ? "On" : "Off")}");
}
} var greenLed=new GreenLED();
var redLed=new RedLED();
var blueLed=new BlueLED();
var switchKey=new Switch();
switchKey.Attach(greenLed);
switchKey.Attach(redLed);
switchKey.Attach(blueLed);
switchKey.ChangeState = true;
switchKey.ChangeState = false; Green LED is On Red LED is On Blue LED is On Green LED is Off Red LED is Off Blue LED is Off