الگوی طراحی Observer

  • شماره مطلب : 4
  • دسته بندی : الگو های طراحی نرم افزار
  • عنوان : الگوی طراحی Observer
  • نویسنده : NetBoss
  • پیش نیاز : الگوهای طراحی نرم افزار

الگوی طراحی Observer زمانی که  یک رابطه One-to-Many  داشته باشیم، به منظور آگاه سازی کلاس های فرزند از تغییرات کلاس والد مورد استفاده قرار میگیرد. الگوی طراحی Observer یک الگوی طراحی Behavioral میباشد.

مثال: فرض کنید که در نرم افزار اوتوماسیون یک آژانس هواپیمایی، ظرفیت یک هواپیمای مسافر بری را یک کلاس با نام FlightCapacity در نظر گرفته باشیم. همانطور که میدانید ظرفیت یک هواپیمای مسافر بری خود میتواند به دسته های متفاوتی مانند، First، Business، Economy  تقسیم بندی شود. پس بیایید اینگونه طراحی نماییم که کلاس Abstract ای با نام FligtSeat  بسازیم که سه کلاس First, Business و Economy از آن ارث بری مینمایند. برای توجیه کلاس Abstract نیز این گونه تفسیر نمایید که یک صندلی درون هواپیما، نمیتواند یک صندلی به جز سه کلاس First, Business و Economy فوق باشد و FligtSeat تنها یک مفهوم انتزاعی میباشد. از طرفی باید لیستی و یا آرایه ای از انواع صندلی های پروازی را در کلاس ظرفیت پرواز داشته باشیم. (دیاگرام را مشاهده نمایید. یک ظرفیت پروازی میتواند از صفر تا چند صندلی پروازی مختلف تشکیل شود.)

 

 حال ما تصمیم گرفته ایم که قیمت صندلی های سه کلاس پروازی فوق بر اساس فیلد ‘قیمت پایه صندلی’ موجود در کلاس FlightCapacity تعیین شود. مثلا فرض بفرمایید که در کلاس Economy قیمت صندلی دقیقا برابر با مقدار فیلد قیمت پایه باشد. در کلاس First قیمت 30% بیشتر از قیمت پایه و در Business قیمت 20% بیشتر از قیمت پایه باشد. حال اگر بخواهیم  که با تغییر در قیمت صندلی پایه (کلاس پدر) قیمت کلاس های پروازی مختلف (کلاس های فرزند) را بروز رسانی نموده و آنها را نمایش دهیم میتوان از الگوی طراحی Observer استفاده نمود .  به نحوه پیاده سازی کدها و نمودا دقت کنید. با هر بار تغییر در فیلد قیمت پایه در کلاس پدر مقادیر قیمت در کلاس های فرزند بروز رسانی میشوند.

 

دیاگرام پیاده سازی الگوی طراحی Observer

الگوی طراحی Observer
برای وضوح بیشتر عکس را در تب جداگانه ای باز نمایید.

نمایی از کلاس ظرفیت پروازی 

public class FlightCapacity
{
public FlightCapacity()
{
FlightSeats=new List<FlightSeat>();
}
public decimal BasePrice { get; set; }
public List<FlightSeat> FlightSeats { get; set; }

public void SetBasePrice(decimal price)
{
BasePrice = price;
Console.WriteLine("Base price has been set to {0}",BasePrice);
NotifySeats();
}

public void Attach(FlightSeat seat)
{
FlightSeats.Add(seat);
}

private void NotifySeats()
{
FlightSeats.ForEach(x=>x.Update());
}
}


نمایی از Abstract Class

public abstract class FlightSeat
{
protected FlightCapacity Capacity { get; set; }
public abstract void Update();
public decimal SeatPrice { get; set; }

}


نمای یکی از کلاس های فرزند

public class Business:FlightSeat
{
public Business(FlightCapacity capacity)
{
Capacity = capacity;
Capacity.Attach(this);
}
public override void Update()
{
var basePrice = Capacity.BasePrice;
SeatPrice = basePrice + 100000;
Console.WriteLine("Business class seat price has been set to {0}",SeatPrice);
}
}


نمایی از کلاس استفاده کننده از الگوی طراحی Observer و خروجی

class Program
{
static void Main(string[] args)
{
var capacity=new FlightCapacity(100000);
var business=new Business(capacity);
var economy=new Economy(capacity);
//
capacity.SetBasePrice(200000);
Console.Read();
}
}

Base price has been set to 200000
Business class seat price has been set to 300000
Economy class seat price has been set to 200000


شما نیز میتوانید با پیروی از ساختار و مفهوم فوق الگوی طراحی Observer را پیاده سازی نمایید.

Add a Comment

Your email address will not be published. Required fields are marked *

Copy Protected by Chetan's WP-Copyprotect.