این نوع از دیزاین پترن ها جهت بهبود نظم و ساختار اشیا (Objects) و ایجاد توابع جدید از شئ (Object) مورد نظر استفاده میشود.
این درواقع همون آداپتور خودمونه که دوتا چیز نا سازگار رو بوسیله ی یک مبدل سازگار می کنه.
مثال عملیش اینه که فرض کنید دوتا فرمت متفاوت داریم xml و json که نمیشه به هم تبدیلشون کرد
یک واسط می سازیم که فرمت XML رو به Json تبدیل کنه
اسم این دیزاین پترن به این دلیل پله چون بین انتزاع (Abstraction) و پیاده سازی (Implementation) یک پل ایجاد می کنه و اونا رو از هم جدا می کنه!
این دیزاین پترن کلاس هایی بزرگ هستند و خیلی شبیه به هم هستند رو جدا سازی می کنه!
برای مثال به جای اینکه برای وسایل مختلف کنترل بسازیم می تونیم یک کنترل داشته باشیم که وسایل مختلف رو خاموش و روشن کنه!
بذارید یک مثال دیگه بزنم
همون طور که تو شکل زیر می بینید برای هر شکل و رنگ یک کلاس تعریف شده!
به جای تعریف کلاس میشه Color و Type تعریف کرد!
جاهایی استفاده میشه که یک دسته بندی مثل درخت باشه
فرض کنید یک سایت داریم آنلاین داریم که وقتی چیزی ازش سفارش داده میشه می خوایم قیمت اجناس رو حساب کنیم.
با استفاده از دیزاین پترن Composite خیلی راحت میشه از زیر مجموعه ها پرسید قیمتتون چنده و بعد با هم جمع زد
بذارید یک مثال دیگه بزنم
درجه های سربازی تو هر کشوری وجود داره که به صورت درختیه
فرض کنید یک ارتشبد می خواد وضعیت سرباز ها رو بدونه
خب مسلماً از خود سرباز ها نمی پرسه بلکه از مقام های پایین تر خودش می پرسه و اونا بهش میگن
همون طور که تزئین کیک راحت و منعطفه کد ما هم باید اینطوری باشه!
یعنی یک کیک Base داریم و هر جور که بخوایم تزئینش می کنیم!
یا مثلاً بخش های مختلف یک تفنگ خیلی راحت سرهم و از هم جدا بشه.
یا مثلاً فرض کنید تو یک سایت ثبت نام کردید و ازتون می پرسه نوتیفیکیشن هارو چطوری براتون بفرسته؟
این حق انتخاب این امکان رو به کاربر میده که هر فیچری که خواست رو انتخاب کنه!
گاهی وقت ها شما از یک کتابخونه ی پیچیده تو برنامتون استفاده می کنید که به همه ی قابلیت هاش نیاز ندارید و فقط یک قابلیت کوچیکش رو می خواید
به عنوان مثال شما یک کتابخونه ی تبدیل فیلم و عکس دارید که فقط نیاز به تبدیل png به jpg دارید!
ایده ی این دیزاین پترن از Cache کردن میاد!
مثلاً الان که دارید این مقاله رو می خونید اگر رفرش کنید عکس هاش دوباره دانلود نمیشه!
بلکه عکس ها از Cache لود میشه!
مثال کاربردی:
فرض کنید شما تو بازیتون هزاران پارتیکل دارید
اگر قرار باشه به طور معمولی پارتیکل ها تولید بشه Ram به فنا میره
الگوی Flyweight میگه چیز هایی که مشترکه و چیز هایی که متغییره جدا بشه!
مثلاً پارتیکل اسپرایت ها و رنگش یکیه ولی مختصات و جهت و سرعتش فرق می کنه
پس برای Instantiate کردن از قالب یکسال استفاده می کنیم
از اونجایی که هزارتا فیلد Sprite فضای بیشتری نسبت به هزار تا فیلد float اشغال می کنه
وقتی جدا سازی انجام بشه فضای کمتری اشغال می کنه
شما وقتی می خواید پول از بانک بگیرید به جای اینکه برید بانک می تونید از عابر بانک ها استفاده کنید
یا مثلاً شما به جای اینکه پول بدید می تونید از کارت عابر بانک استفاده کنید که یک Proxy محسوب میشه
دیزاین پترن Proxy درواقع یک واسط بین مبدأ و مقصده در نتیجه می تونیم یکسری محدودیت ها مثل محدودیت های امنیتی رو لحاظ کنیم.
یک کاربرد دیگه هم داره که باعث بهینه شدن کد میشه
فرض کنید تو کد شما یک کلاس هست که برای دسترسی بهش باید ازش Instantiate بشه
در حالت عادی ممکنه 100 بار ازش Instantiate بشه که بهینه نیست
می تونیم با Proxy که واسط هست یکبار Instantiate کنیم و بعد Cache کنیم بعدش هر بار که Instantiate شدن فراخونی میشه اول چک می کنه وجود داره یا نه؟ اگر وجود داشت که استفاده می کنه و لی اگر نبود Instantiate می کنه