در طول زمان برنامهنویسان برای توسعهی نرمافزارها با مشکلات مختلفی مواجه میشدند. بسیاری از این مشکلات مستقل از زبانهای برنامهنویسی و مشابه هم بودند. بنابراین برای حل این مشکلات راهحلهای مختلفی ارائه شد که به بهترین روش حل و رفع این مشکلات الگوهای طراحی یا Design Pattern میگویند. به عبارت دیگر مجموعهای از بهترین راهحلهای مشکلات متداول در فرآیند برنامهنویسی نرمافزار را الگوهای طراحی مینامند. الگوهای طراحی برای حل مشکلات رایج در برنامهنویسی شیگرا به وسیلهی برنامهنویسانی باتجربه توسعه داده شدهاند. الگوهای طراحی جزو معماریهای نرمافزاری نیستند و فقط شیوهای صحیح از کدنویسی شیگرا را ارائه میدهند. بنابراین این الگوها فقط در قلمرو کدنویسی شیگرا وارد میشوند و مستقل از زبانهای برنامهنویسی هستند.
الگوهای طراحی اولین بار توسط کریستوف الکساندر (Christopher Alexander) ارائه شدند. کریستوف الکساندر از الگوهای طراحی تحت عنوان راهحلهایی برای مشکلاتی یاد میکرد که به صورت متداول در فرآیند برنامهنویسی رخ میدهند. مبحث الگوهای طراحی در سال 1994 در کتاب Design Patterns: Elements of Reusable Object-Oriented Software توسط یک گروه چهار نفره ملقب به Gang of Four یا به اختصار GOF مطرح شد. در این کتاب ۲۳ الگوی طراحی کلاسیک نرمافزار با زبانهای شیگرا مطرح در آن زمان ++C و Smalltalk مورد بحث قرار گرفته است. چهار نویسندهی این کتاب، اریک گاما (Erich Gamma)، ریچارد هلم (Richard Helm)، رالف جانسون (Ralph Johnson) و جان ولیزدس (John Vlissides) هستند. این کتاب تا تاریخ آوریل ۲۰۰۷، 36 بار تجدید چاپ شده است.
طبقهبندی الگوهای طراحی
از آنجا که الگوهای طراحی فراوانی وجود دارد نیاز به شیوهای جهت سازماندهی آنها وجود دارد. در این کتاب الگوهای طراحی به گونهای طبقهبندی شدهاند که برنامهنویسان به راحتی به خانوادههای الگوهای مربوطه ارجاع نمایند و الگوی مناسب را انتخاب کنند. همچنین این طبقهبندی به یادگیری سریعتر الگوهای موجود کمک میکند. براساس دو ضابطه الگوهای طراحی طبقهبندی می شوند:
1- الگوهای طراحی با توجه به کاربردها و اهدافی که به آن منظور ارائه شده اند، به سه دسته عمومی سازنده (Creational)، ساختاری (Structural) و رفتاری (Behavioral) تقسیمبندی شدهاند. الگوهای سازنده به فرآیند ایجاد اشیا مربوط میشوند. الگوهای ساختاری به ترکیب کلاسها یا اشیا میپردازند. الگوهای رفتاری شیوههایی را که در آنها کلاسها یا اشیا تعامل میکنند را مشخص کرده و وظایف را توزیع میکنند.
2- الگوهای طراحی با توجه به حوزه (Scope) مورد استفاده نیز به دو دسته الگوهای کلاس و شی تقسیم میشوند. الگوهای کلاس به روابط میان کلاسها و کلاسهای فرعی آنها میپردازد. این روابط به گونهای از طریق وراثت مستقر میگردند که در زمان کامپایل ایستا باشند. الگوهای شی به روابط اشیا میپردازند که میتواند در حین اجرا تغییر کنند و پویاتر هستند. تقریبا کلیهی الگوها تا حدی از وراثت استفاده میکنند. توجه داشته باشید اغلب الگوها در حوزه شی قرار میگیرند.
الگوهای کلاس سازنده بخشی از سازنده اشیا را به کلاسهای فرعی واگذار میکنند، در حالیکه الگوهای شی سازنده آن را با شی دیگری تعویض میکنند.
الگوهای کلاس ساختاری از وراثت جهت ساختن کلاسها استفاده میکنند، در حالیکه الگوهای شی ساختاری به شرح راههایی جهت نصب اشیا میپردازد.
الگوهای کلاس رفتاری از وراثت جهت توصیف الگوریتمها و جریان کنترل استفاده میکنند، در حالیکه الگوهای شی رفتاری شرح میدهند که چگونه یک گروه از اشیا جهت انجام وظیفهای که هیچ شی منفردی قابل به انجام آن نیست مشارکت میکنند.