Seyed Morteza Kamali
Seyed Morteza Kamali
خواندن ۴ دقیقه·۵ سال پیش

دیزاین پترن های ساختاری

این نوع از دیزاین پترن ها جهت بهبود نظم و ساختار اشیا‌ (Objects) و ایجاد توابع جدید از شئ (Object) مورد نظر استفاده میشود.

دیزاین پترن Adapter

این درواقع همون آداپتور خودمونه که دوتا چیز نا سازگار رو بوسیله ی یک مبدل سازگار می کنه.

مثال عملیش اینه که فرض کنید دوتا فرمت متفاوت داریم xml و json که نمیشه به هم تبدیلشون کرد

یک واسط می سازیم که فرمت XML رو به Json تبدیل کنه


دیزاین پترن Bridge

اسم این دیزاین پترن به این دلیل پله چون بین انتزاع (Abstraction) و پیاده سازی (Implementation) یک پل ایجاد می کنه و اونا رو از هم جدا می کنه!

این دیزاین پترن کلاس هایی بزرگ هستند و خیلی شبیه به هم هستند رو جدا سازی می کنه!

برای مثال به جای اینکه برای وسایل مختلف کنترل بسازیم می تونیم یک کنترل داشته باشیم که وسایل مختلف رو خاموش و روشن کنه!

بذارید یک مثال دیگه بزنم

همون طور که تو شکل زیر می بینید برای هر شکل و رنگ یک کلاس تعریف شده!

به جای تعریف کلاس میشه Color و Type تعریف کرد!


دیزاین پترن Composite


جاهایی استفاده میشه که یک دسته بندی مثل درخت باشه


فرض کنید یک سایت داریم آنلاین داریم که وقتی چیزی ازش سفارش داده میشه می خوایم قیمت اجناس رو حساب کنیم.


با استفاده از دیزاین پترن Composite خیلی راحت میشه از زیر مجموعه ها پرسید قیمتتون چنده و بعد با هم جمع زد

بذارید یک مثال دیگه بزنم

درجه های سربازی تو هر کشوری وجود داره که به صورت درختیه

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

خب مسلماً از خود سرباز ها نمی پرسه بلکه از مقام های پایین تر خودش می پرسه و اونا بهش میگن

دیزاین پترن Decorator

همون طور که تزئین کیک راحت و منعطفه کد ما هم باید اینطوری باشه!

یعنی یک کیک Base داریم و هر جور که بخوایم تزئینش می کنیم!


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


یا مثلاً فرض کنید تو یک سایت ثبت نام کردید و ازتون می پرسه نوتیفیکیشن هارو چطوری براتون بفرسته؟

این حق انتخاب این امکان رو به کاربر میده که هر فیچری که خواست رو انتخاب کنه!



دیزاین پترن Facade

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

به عنوان مثال شما یک کتابخونه ی تبدیل فیلم و عکس دارید که فقط نیاز به تبدیل png به jpg دارید!


دیزاین پترن Flyweight

ایده ی این دیزاین پترن از Cache کردن میاد!


مثلاً الان که دارید این مقاله رو می خونید اگر رفرش کنید عکس هاش دوباره دانلود نمیشه!

بلکه عکس ها از Cache لود میشه!


مثال کاربردی:

فرض کنید شما تو بازیتون هزاران پارتیکل دارید

اگر قرار باشه به طور معمولی پارتیکل ها تولید بشه Ram به فنا میره

الگوی Flyweight میگه چیز هایی که مشترکه و چیز هایی که متغییره جدا بشه!

مثلاً پارتیکل اسپرایت ها و رنگش یکیه ولی مختصات و جهت و سرعتش فرق می کنه

پس برای Instantiate کردن از قالب یکسال استفاده می کنیم

از اونجایی که هزارتا فیلد Sprite فضای بیشتری نسبت به هزار تا فیلد float اشغال می کنه

وقتی جدا سازی انجام بشه فضای کمتری اشغال می کنه

دیزاین پترن Proxy

شما وقتی می خواید پول از بانک بگیرید به جای اینکه برید بانک می تونید از عابر بانک ها استفاده کنید


یا مثلاً شما به جای اینکه پول بدید می تونید از کارت عابر بانک استفاده کنید که یک Proxy محسوب میشه


دیزاین پترن Proxy درواقع یک واسط بین مبدأ و مقصده در نتیجه می تونیم یکسری محدودیت ها مثل محدودیت های امنیتی رو لحاظ کنیم.


یک کاربرد دیگه هم داره که باعث بهینه شدن کد میشه

فرض کنید تو کد شما یک کلاس هست که برای دسترسی بهش باید ازش Instantiate بشه

در حالت عادی ممکنه 100 بار ازش Instantiate بشه که بهینه نیست

می تونیم با Proxy که واسط هست یکبار Instantiate کنیم و بعد Cache کنیم بعدش هر بار که Instantiate شدن فراخونی میشه اول چک می کنه وجود داره یا نه؟ اگر وجود داشت که استفاده می کنه و لی اگر نبود Instantiate می کنه

دیزاین پترنبرنامه نویسیdesignpatterns
شاید از این پست‌ها خوشتان بیاید