در مهندسي نرم*افزار، الگوي طراحي (به انگليسي: Design Pattern) يک راه*حل عمومي قابل تکرار براي مسائل و مشکلات متداول در يک زمينه در طراحي نرم*افزار است. الگوي طراحي، يک طراحي تمام*شده نيست که به صورت مستقيم بتواند تبديل به کد منبع ياماشين شود؛ بلکه، يک توضيح يا قالب براي حل يک مسئله در شرايط مختلف است. الگوها به عنوان بهترين روش ممکن که يک برنامه*نويس مي*تواند در هنگام طراحي يک برنامه براي حل مشکلاتش استفاده کند، معرفي مي*شوند. الگوهاي طراحي شيءگرا نوعاً نشان*دهنده*ي روابط و تعامل*ها بين کلاس*ها و شيء*ها هستند، بدون اين*که کلاس*ها يا اشياء نهايي برنامه را مشخص کند. الگوهايي که در خود وضعيت*هاي تغييرپذير دارند، شايد مناسب زبان*هاي برنامه*نويسي تابعي نباشند. هم*چنين، در بعضي از زبان*ها که براي حل يک مسئله راه*حل*هاي آماده*ي از پيش تعريف*شده وجود دارد، استفاده از بعضي الگو*ها براي حل مسئله*ي مشابه مي*تواند لازم نباشد. به همين ترتيب، الگوهاي طراحي شيء*گرا ممکن است براي زبان*هاي غير شي*ءگرا مناسب نباشند.





آشنايي با مفاهيم


در الگوي طراحي از اشياء ويژه*اي به نام آداپتور (واسطه) استفاده مي*شود. اين آداپتورها به اشياء مورد نياز در پروژه مرتبط مي*شوند. نوشتن برنامه تا حد زيادي از طريق اين واسطه*ها انجام مي*شود. الگوهاي طراحي را بر اساس دو معيار طبقه بندي مي*کنيم.
?-اولين معيار، که مقصود ناميده شده، منعکس کننده آنچه يک الگو انجام مي دهداست. يک الگو ممکن است هدف ايجادي، ساختاري يا رفتاري داشته باشد.
الگوهاي ايجادي پروسه ايجاد اشياء را مورد توجه قرار مي*دهند.
الگوهاي ساختاري با ترکيب کلاسها و اشياء سروکار دارند.
الگوهاي رفتاري طرقي که اشياء با همديگر فعل و انفعال انجام داده و وظايف را توزيع مي*کنند مشخص مي*سازند.
?- معيار دوم، که محدوده ناميده شده، مشخص کننده اينکه الگو بر روي کلاسها يا اشياء اعمال مي*گردد. است. الگوهاي در محدوده کلاسها با ارتباطات بين کلاسها و زير کلاسهاي آنها سر و کار دارند. اينگونه ارتباطات از طريق وراثت برقرار مي*گردد، که بنابراين در زمان کمپايل ثابت مي*شوند. الگوهاي در محدوده اشياء با ارتباطات بين اشياء سرو کار داشته که مي*تواند در زمان اجرا تغيير کرده و در نتيجه پويا هستند. تقريباً تمام الگوها از وراثت استفاده مي*کنند. بنابراين الگوهايي که با برچسب "در محدوده کلاس" معين شده*اند آنهايي هستند که تنها بر روي ارتباط بين کلاسها تاکيد دارند. توجه کنيد که بيشتر الگوها در محدوده اشياء عمل مي*کنند.
الگوهايايجادي که در محدوده کلاسها هستند قسمتي از ايجاد اشياء را به زير کلاسها محول مي*کنند، در حاليکه الگوهاي ايجادي در محدوده اشياء چنين عملي را به شيء ديگري محول مي*نمايند.
الگوهاي ساختاري کلاسي از وراثت براي ترکيب کلاسها استفاده کرده در عوض الگوهاي ساختاري در محدوه اشياء روشهايي براي آميختن اشياء را شرح مي*دهند.
الگوهاي رفتاري کلاسي از وراثت براي تشريح الگوريتم*ها و کنترل جريان اجراي برنامه*ها استفاده مي*کنند در صورتيکه الگوهاي رفتاري شيئي چگونگي همکاري گروهي از اشياء براي انجام يک وظيفه که يک شيء به تنهايي نمي*تواند به انجام رساند را شرح مي*دهند.


تاريخچه


بحث Design Pattern براي اولين بار در دنياي نرم*افزار توسط GoF صورت گرفت. يک گروه چهار نفره شامل: Erich Gamma ،Richard Helm ،Ralph Johnson و John Vlissides ملقب به Gang of Four يا GoF هستند. اين گروه در ?? اکتبر سال ???? کتابي را تحت عنوان Design Patterns: Elements of Reusable Object-Oriented Software منتشر کردند. (اين کتاب تا تاريخ آوريل ????، سي و ? بار تجديد چاپ شده است) آنها در اين کتاب ?? الگوي طراحي کلاسيک را با زبان*هاي شي گرا مطرح در آن زمان (++C و Smalltalk) براي اولين بار مورد بحث قرار دادند.





کاربرد


الگوهاي طراحي مي*توانند سرعت فرآيند توسعه*ي نرم*افزار را با فراهم آوردن الگوهاي توسعه*ي اثبات*شده و مورد آزمون قرار گرفته افزايش دهند. طراحي نتيجه*بخش نرم*افزار نيازمند درنظر گرفتن پيامدهايي است که ممکن است هنوز در پياده*سازي قابل رؤيت نباشند، اما بعدها خود را نشان خواهند داد. استفاده از الگوهاي طراحي کمک مي*کند تا از بروز خطاهاي کوچک که ممکن است مشکلات بزرگي را ايجاد کنند، جلوگيري شود و علاوه بر آن، خوانايي کد را براي کدنويسان و معماراني که با الگوها آشنا هستند، افزايش مي*دهد.


براي دست*يافتن به انعطاف*پذيري در نرم*افزار، الگوهاي طراحي اغلب اعمال را به صورت غيرمستقيم انجام مي*دهند. اين کار در شرايطي ممکن است طراحي حاصل را پيچيده کند و باعث افت کارايي برنامه شود.


طبق تعريف، براي استفاده از الگوها در هر برنامه*اي که از آن*ها استفاده مي*کند، بايد از نو برنامه*نويسي کرد. از آن*جايي که بعضي از نويسندگان اين نکته را مخالف با en:Code reuse آن*گونه که توسط مهندسي نرم*افزار بر پايه پيکرپار فراهم مي*شود، مي*بينند، پژوهش*گران تلاش کرده*اند تا الگوها را به پيکرپارها تبديل کنند. مير و آرنوت توانستند دو سوم الگوهايي را که رويشان کار مي*کردند، به صورت کامل يا جزئي به پيکرپار تبديل کنند.


تکنيک*هاي طراحي نرم*افزار را به سختي مي*توان در گستره*ي وسيع*تري از مسائل به کار برد.الگوهاي طراحي راه*حل*هايي کلي را در قالبي بيان مي*کنند که وابسته به مسئله*ي مخصوصي نيست.


گاهي اوقات برنامه*نويسان هنگام طراحي و يا پياده سازي برنامه*هاي خود، با کلاس*هايي روبرو مي*شوند که اصطلاحاً کلاس*هاي کلاسيک نيستند. اين گونه کلاس*ها مشکلاتي را ايجاد مي*کنند که با کمک الگوها مي*توان مشکلات را تا حجم قابل قبولي حل کرد.


در واقع طراحي چنين کلاس*هايي، به مرور زمان، گريبان*گير هر برنامه نويسي شده*است و برنامه نويسان خبره با توجه به تجربيات شخصي خود و ديگران، تصميم به ايجاد الگوهايي کرده*اند که راه حل اين گونه مشکلات خواهد بود. در حال حاضر شايد در حدود صدها الگو در اين رابطه وجود داشته باشد که تنها تعداد اندکي از آن*ها استاندارد شده و مورد استفاده طراحان و برنامه*نويسان قرار مي*گيرد.