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

این نوع از دیزاین پترن ها جهت بهبود نظم و ساختار اشیا‌ (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 می کنه