الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرمافزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفهجویی در زمان و تولید کد های با کیفیت، توسعهپذیر و انعطافپذیر استفاده میکنیم. در این مطلب قصد داریم الگوی طراحی Observer را معرفی کنیم.
الگوی طراحی Observer یک الگوی طراحی رفتاری(behavioral) است که یک شئ را به چند کلاس وابسته به آن متصل میکند. این الگو امکانی فراهم میکند که در زمان تغییر وضعیت یک شیء، اشیاء وابسته به آن به طور خودکار مطلع و به روز شوند. الگوی Observer زمانی مفید است که شما نیاز به حفظ ثبات بین اشیاء مرتبط بدون اتصال محکم(tightly coupling) آنها دارید.
الگوی Observer از اجزاء مختلفی تشکیل شده است:
در ادامه مثالی از نحوه پیاده سازی الگوی Observer در سی شارپ آورده شده است:
interface IObserver
{
void Update();
}
class Subject
{
private List<IObserver> observers = new List<IObserver>();
private int state;
public int State
{
get { return state; }
set
{
state = value;
Notify();
}
}
public void Attach(IObserver observer)
{
observers.Add(observer);
}
public void Detach(IObserver observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (IObserver observer in observers)
{
observer.Update();
}
}
}
class ConcreteObserver : IObserver
{
private string name;
private Subject subject;
public ConcreteObserver(string name, Subject subject)
{
this.name = name;
this.subject = subject;
}
public void Update()
{
Console.WriteLine("{0} has received an update: {1}", name, subject.State);
}
}
class Program
{
static void Main(string[] args)
{
Subject subject = new Subject();
ConcreteObserver observer1 = new ConcreteObserver("Observer 1", subject);
ConcreteObserver observer2 = new ConcreteObserver("Observer 2", subject);
subject.Attach(observer1);
subject.Attach(observer2);
subject.State = 5;
subject.Detach(observer2);
subject.State = 10;
Console.ReadKey();
}
}
در مثال بالا، ما یک کلاس Subject داریم که دارای وضعیت قابل تغییر است. همچنین لیستی از اشیاء وابسته به آن دارید که باید در حین تغییر وضعیت، مطاع شوند. هنگامی که وضعیت Subject تغییر می کند، با فراخوانی متد Update همه Observer های متصل شده، این تغییرات را دریافت میکنند. کلاس های Observer متصل شده، هرکدام دارای دستوراتی اختصاصی هستند که در صورت دریافت بروزرسانی، آن ها را اعمال میکنند.
الگوی طراحی Observer زمانی مفید است که شما نیاز به حفظ ارتباط بین اشیاء مرتبط بدون اتصال مستقیم آنها دارید. هنگامی که وضعیت یک شیء تغییر می کند، این تغییر به اطلاع همه اشیاء متصل خواهد رسید و هرکدام از آنها خود را با توجه به دستورات اختصاصی خود بروز خواهند کرد. با استفاده از الگوی Observer، می توانید طراحی انعطاف پذیرتر و مقیاس پذیرتری ایجاد کنید که نگرانی های اجزای مختلف را از هم جدا می کند.
برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همهی الگو های طراحی میشود، برای شما قرار گرفته است.
من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که مینویسم بدردتون بخوره.
ثبت دیدگاه