آشنایی با Observer Design Pattern

در این مقاله مثالی میزنیم که درک ما را از Observer Design Pattern کمک خواهد کرد.درک Observer Design Pattern به ما کمک میکند تا کد های بهینه تر بنویسیم.

آشنایی با  Observer Design Pattern

در این مقاله به بررسی درک observer design pattern در سی شارپ میپردازیم.

الگوی طراحی یک روش استاندارد برای حل یک مشکل معمول اتفاق می افتد.بیشتر اوقات کد ها درست کار میکنند اما قابلیت استفاده مجدد انها کم است.  Observer Design Pattern  برای این امر ما را یاری میکند.  برای ما مهم است که کد در جای درست قرار بگیرد.

با یک مثال سعی میکنیم که این مشکل را درک کنیم. فرض کنید ما در حال ساخت نرم افزار خودرو هستیم و کد کلاس به شرح زیر است.

کلاسی با نام Speedometer : که مسئول گرفتن سرعت می باشد.

کلاسی با نام Display: مسئول گرفتن سرعت و نمایش ان در کنسول میباشد.

حال میگوییم یک متد UpdateSpeed در کلاس speedometer برای تغییرات سرعت قرار داده شده است. کلاس speedometer  یک مرجع برای نگه داری  اشیا Display می باشد.به هنگام سازی اشیا متد در متد  UpdateSpeed در کلاس speedometer تعریف شده است. خب دوستان نوشتن چنین کدی خالی از عیب نیست در زیر برخی از معایب ان را بررسی میکنیم.

1-کلاس speedometer درباره کلاس display اطلاعات دارد. این یک مدل object oriented نیست زیرا در دنیای واقعی یک Speedometer(سرعت سنج) درباره display چیزی نمیداند. حال فرض کنیدبخواهیم نمایش را دیجیتالی کنیم برای همین کلاس speedometer باید اصلاح شود.

2- تست speedometer به اسانی نخواهد بود.در واقع برای تست ، این کلاس مستقل نیست و  هر بار برای نمایش باید مجدد تست شود 

3-ما بدون کلاس نمایش نمی توانیم از کلاس speedometer  مجدد استفاده کنیم .

شرح راه حل:

برای این کار کلاس speedometer باید مقدار سرعت خودرو را به اینترفیس (Interface) بدهد و اینترفیس سرعت خودرو را برای همه به نمایش می گذارد.

کد زیر نمونه ای صحیح در این مسئله می باشد.



public interface ISpeedSource
{
    public event Action<float> SpeedUpdated;
}

public class Speedometer : ISpeedSource
{
    public float speed;
    public event Action<float> SpeedUpdated; 	//This is an event. 
						//Read about events for better understanding.

    public void UpdateSpeed(float speed)
    {
        this.speed = speed;
        SpeedUpdated.Invoke(speed);  		//There are more appropriate ways to invoke an event
    }

    public float GetSpeed()
    {
        return speed;
    }
}

public class Display
{
    ISpeedSource speedSource;

    public Display(ISpeedSource speedSource)
    {
        this.speedSource = speedSource;
        this.speedSource.SpeedUpdated += UpdateDisplaySpeed;
    }    
    
    private void UpdateDisplaySpeed(float speed)
    {
        //Code related to setting display speed
    }     
}

لینک های مقابل برای مطالعه بیشتر درباره Flyweight Design Pattern و Decorator Design Pattern می باشد.

آموزش سی شارپ

دانلود نسخه ی PDF این مطلب