Practical-Design-Patterns

Practices of Design Patterns in programming languages

Stars
122
Committers
2

Design-Patterns

همکاری

برای شروع به همکاری

  • مخزن را فورک کنید، یک انشعاب (Branch) درست کنید، شروع به کار کنید و کارتان را به مخزن اعمال کنید، آن انشعاب را به گیت‌هاب push کنید، و درخواست Pull را ارسال کنید.
  • یا درخواست‌تان را از طریق issue بیان کنید.
  • برای رسم دیاگرام‌های UML از نرم‌افزار Visual Paradigm استفاده شده است، در صورتی که می‌خواهید دیاگرامی اضافه کنید، برای هماهنگی تصاویر پیشنهاد می‌شود از همین نرم‌افزار استفاده کنید.

استفاده از مثال‌ها

  • هر الگو یک پوشه به نام Classic دارد که نام کلاس‌های آن از دیاگرام‌های کتاب GoF گرفته شده است. مثال‌های Classic ایدهٔ اولیه برای الگوها هستند و برای یادگیری ساختار الگوها مناسبند. اما برای آشنایی با کاربرد آن‌ها مثال‌های دیگری غیر از Classic درون پوشهٔ هر الگو گنجانده شده است.
  • برای سادگی بیشتر در مثال‌های C++، مباحث مدیریت حافظه و جلوگیری از Memory Leak مطرح نشده است از این رو در صورتی که می‌خواهید این الگوها را در یک پروژهٔ واقعی استفاده کنید، حواستان باشد که اشیاء را در حافظه مدیریت کنید.

Creational Patterns

  • Builder: روند ساخت یک شیء پیچیده را از نمایش آن جدا می‌کند به طوری که یک روند ساخت مشترک می‌تواند برای ساخت انوع بازنمایی‌ها به کار گرفته شود.

  • Factory Method: واسطی برای ساخت اشیاء ایجاد می‌کند، اما به زیرکلاس‌ها اجازه می‌دهد که تصمیم بگیرند که چه کلاسی را نمونه‌سازی کنند. این الگو اجازه می‌دهد تا نمونه‌برداری کلاس، به زیرکلاس‌ها معوق شود.

  • Prototype: انواع اشیائی که باید ساخته شوند را با استفاده از یک نمونهٔ اولیه، مشخص می‌کند و اشیاء جدید را با کپی کردن این نمونهٔ اولیه تولید می‌کند.

  • Singleton: تضمین می‌کند که کلاس تنها یک نمونه داشته باشد و دسترسی سراسری برای آن فراهم می‌کند.

Structural Patterns

  • Bridge: لایهٔ انتزاع را از لایهٔ پیاده‌سازی جدا می‌کند، بنابراین دو کلاس می‌توانند مستقلاً تغییر کنند.

  • Composite: اشیاء را درون ساختار درختی ترکیب می‌کند تا سسله-مراتب جز-کل را ارائه کند. الگوی کامپوزت به کارخواه‌ها اجازه می‌دهد تا با اشیاء تکی و با اشیائی که ترکیبی از اشیاء هستند، به یک صورت رفتار کند.

  • Decorator: وظایف و قابلیت‌های بیشتری را به صورت داینامیک به شیء اضافه می‌کند. دکوریتورها برای توسعهٔ رفتارها و قابلیت‌ها روش انعطاف‌پذیر جایزینی را به جای زیرکلاس‌سازی ارائه می‌دهند.

  • Facade: واسط یکپارچه‌ای را برای مجموعه‌ای از واسط‌ها در زیر سیستم، ارائه می‌دهد. این الگو واسط سطح-بالاتری را تعریف می‌کند که استفاده از زیرسیستم را ساده‌تر می‌کند.

  • Flyweight: استفادهٔ دوبارهٔ بسیاری از اشیاء fine-grain را با اشتراک آن‌ها در سیستم، آسان می‌کند.

  • Proxy: برای کنترل دسترسی به اشیاء، نماینده یا نگهدارنده‌ای برای آن‌ها ارائه می‌کند.

Behavioural Patterns

  • Command: درخواست را به عنوان یک شیء کپسوله می‌کند، از این رو اجازه می‌دهد تا بتوانید کارخوه‌ها را با درخواست‌ها، صف‌ها و یا لاگ‌های متفاوت پارامتری کنید.

  • Interpreter: یک بازنمایی برای گرامر زبان داده شده تعریف می‌کند و مفسر توسط این باز نمایی، جملات زبان را تفسیر می کند.

  • Iterator: روشی برای دستری به عناصر یک شیء اگریگیت فراهم می‌کند بدون اینکه اصول پیاده‌سازی و ساختمان دادهٔ لایهٔ زیرین اگریگیت را نمایش دهد.

  • Mediator: شیء‌ای را تعریف می‌کند که نحوهٔ ارتباط بین مجوعه‌ای از اشیاء را کپسوله می‌کند. این الگو با جلوگیری ارتباط صریح بین اشیاء از جفتگری ضعیف (loose coupling) پشتیبانی می‌کند.

  • Memento: بدون تخلف از کپسوله‌سازی، وضعیت داخلی شیء ضبط و استخراج می‌کند از این رو شیء بعداً می‌تواند به این حالت برگردد.

  • Observer: وابستگی یک-به-چند بین اشیاء تعریف می‌کند بنابراین وقتی یک شیء وضعیت‌اش را تغییر می‌دهد، تمامی اشیاء وابسته به آن از آن تغییر مطلع شده و به صورت خودکار به روز می‌شوند.

  • State: به شیء این اجازه را می‌دهد که وقتی وضعیت درونی‌اش تغییر کرد، رفتارش را تغییر دهد. به نظر می‌رسد که شیء کلاس خود را عوض می‌کند.

  • Strategy: خانواده‌ای از الگوریتم ها را تعریف می‌کند، هر یک را کپسوله می‌کند و آن‌ها را جابه‌جا پذیر می‌کند. الگوی استراتژی اجازه می‌دهد که الگوریتم‌ها مستقل از کارخواهی که از آن‌ها استفاده می‌کند، تغییر کنند.

  • Template Method: استخوان‌بندی و شالودهٔ اصلی عملیات الگوریتم را تعریف می‌کند، و پیاده‌سازی هر مرحله را به زیرکلاس‌ها می‌سپارد. این الگو، به زیرکلاس‌ها این اختیار را می‌دهد که تا خودشان، مراحل الگوریتم را پیاده کنند بدون اینکه ساختار الگوریتم را تغییر دهند.

  • Visitor: اعمالی که باید روی عناصری از شیء اجرا شود را ارائه می‌کند. این الگو اجازه را می‌دهد تا اعمال جدیدی تعریف کنید بدون اینکه کلاس‌هایی که این اعمال روی آن‌ها انجام می‌شود را تغییر دهید.

سپاسگزاری

  • با تشکر از استینلی شیکو که دیاگرام‌های UML را رسم کرده است و اجازهٔ استفاده از آن‌ها در پروژه را به من داد.
  • با تشکر از شیانگ وانگ که ایدهٔ اصلی مثال‌های سی‌پلاس‌پلاس بخش Classic از اوست، اکثر این مثال‌ها در حقیقت ساده شده و مشتقی از کار شیانگ محسوب می‌شود که اجازهٔ استفاده از آن‌ها را به من داد.

معرفی کتاب