Design Pattern به زبان ساده

آخرین بروز رسانی: 1403/10/28

در سال 1994 گروه 4 نفره Gang of Four که به اختصار با نام GOF شناخته می‌شوند 23 الگوی طراحی را، طبقه بندی و ارائه کردند. 
مفهوم الگوهای طراحی در برنامه نویسی به طور گسترده ای به گروه Gang of Four - اریش گاما، ریچارد هلم، رالف جانسون، و جان ولیسیدز نسبت داده می شود که این ایده را از طریق کتاب خود "الگوهای طراحی: عناصر نرم افزار شی گرا قابل استفاده مجدد" رایج کردند. منتشر شده در سال 1994

در این جدول سعی کردم همشون و به زبون ساده و بدون اشاره به زبون خاصی توضیح بدم. با هر زبان برنامه نویسی که object oreinted باشه میشه این پترنها رو پیاده سازی کرد. اگر جایی  براتون گنگ هست بگید تا با مثال کدی بیشتر توضیح بدم

Factory Method

درجه استفاده :5

Creational

کلاس پایه داریم به اسم product  و کلی subclass
کلاس factory  داریم و به تعداد نیاز subclass  (که در شرایط خاص به تعداد subclassهای product هستن) و مسول ساخت یک یا چند ابجکت از سابکلاسهای product  هستن.
در اصل subclass فکتوری تصمیم میگیره چه ابجکتی(یا چند ابجکت) از نوع product  ساخته بشه

Abstract Factory

درجه استفاده :5

Creational

یه level  بالاتر از فکتوری متد هست.
در اصل کلاس کلاینت (مصرف کننده نهایی) فقط میدونه قراره یه ابجکتی از نوع فکتوری بهش پاس داده بشه اما اینکه چه کلاسی بهش پاس داده بشه رو جای دیگه تصمیم میگیرن و از این به بعد طبق قانون فکتوری متد هر کلاسی که بهش پاس داده بشه وظیفه ساخت ابجکت (یا ابجکتها) از نوع product  رو داره

 

Facade

درجه استفاده :5

Structural

ترکیب چند کلاس کوچیک و اجرا توابع آن بر اساس ترتیب
کلاس  façade  ابجتهایی از subclassها رو داره و متدهایی که ترتیب اجرای متدهای subclassها رو بر عهده داره و کلاینت فقط با facade کار میکنه

Iterator

درجه استفاده :5

Behavior

راهکاری برای دسترسی مدام به attrbuteها کلاس aggregate  بدون افشای نمایندگی ان

کلاس Aggregate متدی داره که کلاس iterator ش رو میسازه و برمیگردونه.
کلاس iterage در Constructorش ابجکتی از نوع aggregate میگیره . و متدهایی برای دسترسی به پراپرتیهای کلاس aggregate رو ارائه میده

Observer

درجه استفاده :5

Behavior

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

ابجکت ما (کلاس subject) متدی به اسم attach داره که ورودی از نوع observer  میگیره و در لیست observerهاش قرار میده. و متدی به اسم notify()  که در یک loop  میاد متد update  همه آبزرورهاش رو call  میکنه و همین notify  چه زمانی call  میشه؟زمانی که پراپرتی مقدارش تغییر کنه و ما بخواهیم بقیه با خبر بشن (مثلن در setter  پراپرتی نوشته بشه خوبه)
کلاس observer  هم در کانستراکتورش ایجکتی از نوع subject  داره و متدی به اسم update  که به پراپرتیهای کلاس  subject   دستری داره و وقتی call  بشه یعنی تغییری رخ داده و میتونه کدی که درش هست رو اجرا کنه

Singleton

درجه استفاده :4

Creational

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

Adapter

درجه استفاده :4

Structural

 

Composite

درجه استفاده :4

Structural

برای ایجاد ساختار tree  مانند استفاده میشه
یه base  کلاس به اسم component داریم که کلاس composite  و leaf  ازش ارث میبرن.
کلاس composite لیستی از نوع component داره و متدهایی برای add  و remove  ازش (و فرق leaf  با composite  اینه که leaf   در عمل قابلیت اضافه کردن زیرمحموعه رو نداره) البته متدی برای نمایش elemanهای لیستش داره به اسم display
نکته : اگر قرار باشه leaf نداشته باشیم در اصل کلاس component  هم میشه حذف بشه و کلاس composite به تنهایی کامل هست

 

Proxy

درجه استفاده :4

Structural

چیزی شبیه wraper هست.
اینترفیسی داریم به اسم subject  وکلاس پیاده سازش به اسم realSubject  و البته کلاس proxy
متدها در realSubject  پیاده سازی میشن
کلاس proxy ابجکتی از نوع realSubject   داره که متدهاش رو کل میکنه بعلاوه یکسری کارهای دیگه

Client هم در اصل proxy رو new میکنه و باهاش کار میکنه

 

Command

درجه استفاده :4

Behavior

 

Strategy

درجه استفاده :4

Behavior

چندین استراتژی برای اجرای یک عملیات داریم هر کدام در کلاس جدا پیاده‌سازی می‌شود و کلاس استفاده کننده ابجکتی از نوع استراتژی داره که در ctor  بهش پاس داده میشه و همون و کال میکنه
کلاس context داریم
کلاس stategy  داریم با کلی subclass  که متد algorithm() رو پیاده سازی کردن  
کلاس context  یه ctor  داره که ورودی از نوع startegy  داره و متدهاش در اصل فقط متد algorithm پراپرتی strategy  رو کال میکنه

 

NET Template

درجه استفاده :3

Behavior

در اصل شما کلیت الگوریتم رو توالی کال کردن توابع رو تو کلاس parent مینویسی(که abstract هست) و جزعیات پیاده سازی توابع در subclass  ها پیاده سازی میشن (در اصل توابع هم override شده هستن که در کلاس patent بصورت abstarct تعریف شده بودند)

NET Prototype

درجه استفاده :3

Creational

 

NET Bridge

درجه استفاده :3

Structural

 

NET Decorator

درجه استفاده :3

Structural

 

NET State

درجه استفاده :3

Behavior

به کلاس اجازه میده رفتارش رو با توجه به stateی که پراپرتیهاش دارن تغییر بده
یه کلاس contextی داریم که پراپرتی از نوع state داره.  و کلاس state داریم که پراپرتی نوع context داره با کلی subclass که در اصل Handler رو پیاده سازی میکنه. و البته تغییر state  خود context  هم در این subclassها پیاده سازی میشن(با تغییر پراپرتی استیت context).
در کلاس context  من رفتارها فقط وظیفشون call  کردن متد مربوط به اون رفتار ار پراپرتی state هست. به این ترتیب به تغییر state  کلاس کانتکتس رفتارش هم تغییر میکنه چون الان داره متد state جدیدی رو کال میکنه.

 

Builder

درجه استفاده :2

Creational

 

Mediator

درجه استفاده :2

Behavior

کلاس پابلیشر متد send وlisten داره و یه ابجکت ار نوع mediator.
متد send فقط متد send ابجکت mediatorش رو صدا میزنه.
کلاس mediator  لیستی از پابلیشره داره و متد send که میکرده پابلیشر اصلی رو پیدا میکنه و متد listenش رو صدا میزنه

 

برای پیاده سازی listener و publisher بکار میره

 

Chain of Resp

درجه استفاده :2

Behavior

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

کلاس Handler با کلی subclass که پراپرتی از  جنس خودش داره به اسم successor و 2 تابع SetSuccessor که کارش مقداردهی successor هست و abstract HandleRequest که توسط subclassها پیاده سازی میشه و توی اون مشخص میشه در چه شرطی تابع HandleRequest پراپرتی successorش اجرا بشه(که بضورت chan میره تا اخر این قسمت)
subclassها هم در کلاس client  ساخته میشه و successorش (که در اصل مرحله بعدی هست) بهش معرفی میشه

Flyweight

درجه استفاده :1

Structural

 

 

Interpreter

درجه استفاده :1

Behavior

کلاسی به اسم context دارم و کلاسی به اسم interpreter که کلی subclass  داره.
این subclassها متدی به اسم interpret دارن که ورودی از نوع context داره که قراره روش یکسری چیزایی اجرا بشن.
حالا اینکه این یکرسی چیزها چی هستن تو subclassها پیاده سازی میشن که در کلاینت انتخاب و new میشن و context به متد intrpertشون فرستاده میشه

Memento

درجه استفاده :1

Behavior

 

Visitor

درجه استفاده :1

Behavior

 

نکته:💡  بعضی از اینا شاید تو یعضی زبانها الان دیگه واقعن به این شکل نوشته نشن و بجاشون از ابزارهایی که وجود داره استفاده  بشه . برای مثال singletone نوشتن کلاسها شاید (فقط شاید) دیگه اینجوری نیست چون چرخه حیاط اینها با ioc هندل میشن. یا بجای mediator در دانت ابزار mediatR هست و .....   
ولی در هر صورت دونستنشون میتونی بسیار مفید باشه و به ما تو برنامه نویسی بهتر کمک کنه

نظر دهید

آدرس ایمیل شما منتشر نخواهد شد. فیلدهای الزامی علامت گذاری شده اند *