راهحل عمومی تکرارپذیر برای یک مسئلۀ متداول در طراحی نرمافزار
الگوی طراحی
فرهنگ فارسی
دانشنامه عمومی
الگوهای طراحی (به انگلیسی: Design Patterns) الگوها و مستنداتی از روش های حل برای مشکلات رایج در برنامه نویسی شیءگرا هستند. این الگوها ابتدا توسط کریستوف الکساندر ارائه شد و سپس از سوی گروهی موسوم به دسته چهار (به انگلیسی: Gang of Four) یا به اختصار GOF مورد طبقه بندی قرار گرفت و تحت عنوان کتابی به نام الگوهای طراحی در سال ۱۹۹۴منتشر شد.
نام و طبقه بندی: نام الگو و توصیفی کوتاه برای آن را شامل می شود.
قصد: متنی کوتاه در پاسخ به این پرسش که: این الگو چکاری را انجام می دهد؟ هدف و تفکر پشت این کار چیست؟ و این الگو چه مسالی را حل می نماید؟
نام دیگر: در صورتی که نام شناخته شدهٔ دیگری برای آن وجود دارد ذکر گردد.
انگیزه: سناریویی که در آن از الگوی طراحی استفاده شده باشد و اینکه چگونه از کلاس و شی برای حل مشکل استفاده شده است.
قابلیت کاربردی: توصیفگر شرایط است که این الگو در آن قابل پیاده سازی است.
ساختار: یک نمایش گرافیکی است که براساس تکنیک مدلسازی شیء نمایش داده می شود (که امروزه از زبان مدل سازی یکپارچه برای این کار استفاده می شود)
شرکت کنندگان: کلاس یا اشیا شرکت کننده در الگوی طراحی و بیان مسئولیت هایشان.
همکاری: چگونگی همکاری شرکت کنندگان در الگو
پیاده سازی: نکات پیاده سازی را بیان می نماید.
کد نمونه: مثالی به زبان سی++ یا اسمال تاک (امروزه زبان جاوا جایگزین شده است)
مثال های شناخته شده: مثال هایی از کاربرد در سیستم های واقعی
الگوهای مرتبط: چه الگوهایی شبیه این الگو هستند؟ و تفاوت های اساسی بین آن های چیست؟
کریستوف الکساندر الگوی طراحی را راه حلی برای مسایلی می داند که دایماً در محیط اطراف رخ می دهد، از این رو می توان بدون دوباره کاری در آینده مسایل را با سرعت بالاتری حل نمود.
در طراحی نرم افزارهای مختلف مسایلی دایماً بروز می یابند که در پروژه های قبلی، که حتی دارای قلمرو کاربردی (به انگلیسی: Application Domain) مختلفی هستند، نیز وجود دارند. راه حل موجود برای این روش های غالباً یکسان است و یافتن طراحی مناسب برای این موارد تکراری وقت گیر و هزینه بر است. از این رو می توان راه حل هایی را ارائه نمود که مسایل را ساده نماید. از طرفی روح برنامه نویسی شیءگرا بر مبنای قابلیت باز-استفادگی (به انگلیسی: ReUse) و جز-محوری (به انگلیسی: Component-Based) است، موجب ایجاد برنامه هایی قابل استفاده در آینده خواهد شد.اریک گاما ،ریچارد هلم، رالف جانسون، جام ولیسایدز که بعدها به دستهٔ۴ معروف شدند در سال ۱۹۹۴ کتاب الگوهای طراحی را به همراه مقدمه ای از سوی گریدی بوش به رشتهٔ تحریر درآوردند. این کتاب به دسته بندی ۲۳ الگوهای طراحی می پرداخت که تا آن زمان ابداع شده بودند. گریدی بوش در مقدمهٔ کتاب الگوهای طراحی از الگوهای طراحی به عنوان راه حلی برای ایجاد سیستم های پیچیده نام می برد و از آن به عنوان زبانی نام می برد که می تواند بر روی دامنه های مختلفی مورد استفاده قرار گیرند.
گاما و همکارانش از ارایهٔ روش تصویری برای هر الگو خودداری نمودند. به جای آن از روش توصیف نوشتاری آبوت استفاده نمودند. هر الگو دارای یک قالب است که عبارتند از:
نام و طبقه بندی: نام الگو و توصیفی کوتاه برای آن را شامل می شود.
قصد: متنی کوتاه در پاسخ به این پرسش که: این الگو چکاری را انجام می دهد؟ هدف و تفکر پشت این کار چیست؟ و این الگو چه مسالی را حل می نماید؟
نام دیگر: در صورتی که نام شناخته شدهٔ دیگری برای آن وجود دارد ذکر گردد.
انگیزه: سناریویی که در آن از الگوی طراحی استفاده شده باشد و اینکه چگونه از کلاس و شی برای حل مشکل استفاده شده است.
قابلیت کاربردی: توصیفگر شرایط است که این الگو در آن قابل پیاده سازی است.
ساختار: یک نمایش گرافیکی است که براساس تکنیک مدلسازی شیء نمایش داده می شود (که امروزه از زبان مدل سازی یکپارچه برای این کار استفاده می شود)
شرکت کنندگان: کلاس یا اشیا شرکت کننده در الگوی طراحی و بیان مسئولیت هایشان.
همکاری: چگونگی همکاری شرکت کنندگان در الگو
پیاده سازی: نکات پیاده سازی را بیان می نماید.
کد نمونه: مثالی به زبان سی++ یا اسمال تاک (امروزه زبان جاوا جایگزین شده است)
مثال های شناخته شده: مثال هایی از کاربرد در سیستم های واقعی
الگوهای مرتبط: چه الگوهایی شبیه این الگو هستند؟ و تفاوت های اساسی بین آن های چیست؟
کریستوف الکساندر الگوی طراحی را راه حلی برای مسایلی می داند که دایماً در محیط اطراف رخ می دهد، از این رو می توان بدون دوباره کاری در آینده مسایل را با سرعت بالاتری حل نمود.
در طراحی نرم افزارهای مختلف مسایلی دایماً بروز می یابند که در پروژه های قبلی، که حتی دارای قلمرو کاربردی (به انگلیسی: Application Domain) مختلفی هستند، نیز وجود دارند. راه حل موجود برای این روش های غالباً یکسان است و یافتن طراحی مناسب برای این موارد تکراری وقت گیر و هزینه بر است. از این رو می توان راه حل هایی را ارائه نمود که مسایل را ساده نماید. از طرفی روح برنامه نویسی شیءگرا بر مبنای قابلیت باز-استفادگی (به انگلیسی: ReUse) و جز-محوری (به انگلیسی: Component-Based) است، موجب ایجاد برنامه هایی قابل استفاده در آینده خواهد شد.اریک گاما ،ریچارد هلم، رالف جانسون، جام ولیسایدز که بعدها به دستهٔ۴ معروف شدند در سال ۱۹۹۴ کتاب الگوهای طراحی را به همراه مقدمه ای از سوی گریدی بوش به رشتهٔ تحریر درآوردند. این کتاب به دسته بندی ۲۳ الگوهای طراحی می پرداخت که تا آن زمان ابداع شده بودند. گریدی بوش در مقدمهٔ کتاب الگوهای طراحی از الگوهای طراحی به عنوان راه حلی برای ایجاد سیستم های پیچیده نام می برد و از آن به عنوان زبانی نام می برد که می تواند بر روی دامنه های مختلفی مورد استفاده قرار گیرند.
گاما و همکارانش از ارایهٔ روش تصویری برای هر الگو خودداری نمودند. به جای آن از روش توصیف نوشتاری آبوت استفاده نمودند. هر الگو دارای یک قالب است که عبارتند از:
wiki: طراحی نرم افزار است. الگوی طراحی، یک طراحی تمام شده نیست که به صورت مستقیم بتواند تبدیل به کد منبع یا ماشین شود؛ بلکه، یک توضیح یا قالب برای حل یک مسئله در شرایط مختلف است. الگوها در واقع بهترین روش ممکن هستند که یک برنامه نویس می تواند در هنگام طراحی یک برنامه برای حل مشکلاتش از آن ها استفاده کند. الگوهای طراحی شیءگرا نوعاً نشان دهندۀ روابط و تعامل ها بین کلاس ها و شیء ها هستند، بدون این که کلاس ها یا اشیا نهایی برنامه را مشخص کند. الگوهایی که در خود وضعیت های تغییرپذیر دارند، شاید مناسب زبان های برنامه نویسی تابعی نباشند. هم چنین، در بعضی از زبان ها که برای حل یک مسئله راه حل های آمادۀ از پیش تعریف شده وجود دارد، استفاده از بعضی الگوها برای حل مسئلۀ مشابه می تواند لازم نباشد. به همین ترتیب، الگوهای طراحی شیء گرا ممکن است برای زبان های غیر شیءگرا مناسب نباشند.
(Adapter) رابط یک کلاس را به رابط دیگری که مورد انتظار یک مشتری است تبدیل می کند. این الگو امکان همکاری بین اشیائی که قبلاً بخاطر داشتن رابط های ناسازگار نمی توانستند با هم کار کنند را فراهم می سازد.
(Bridge) یک مفهوم مجرد را از پیاده سازی اش مجزا کرده تا هردو بتوانند به طور مستقل تغییر کنند.
(کامپوزیت) اشیاء را به صورت ساختار درختی برای ایجاد ساختار سلسله مراتبی بفرم part-whole ترکیب می نماید. این الگو اجازه می دهد تا مشتری ها اشیاء منفرد و مرکب را به صورت یکسانی پردازش کنند.
(Decorator) در زمان اجرا وظایف جدیدی به یک شی ء اضافه می کند. این الگو بدیلی قابل انعطاف برای گسترش عملکرد یک کلاس به وسیلهٔ زیر کلاس ساختن از آن را فراهم می کند.
(Facade) یک رابط منفرد برای مجموعه ای از رابط ها در یک زیر سیستم تدارک می بیند. در واقع یک facade رابط سطح بالاتری برای یک زیر سیستم تعریف کرده و باعث می شود تا زیر سیستم را به صورت ساده تری مورد استفاده قرار داد.
(Flyweight) از اشتراک منابع برای فراهم نمودن تعداد زیادی از اشیاء سبک به صورت کارا استفاده می کند.
(Proxy) یک جانشین یا جایگاه برای کنترل دسترسی به یک شیء ایجاد می کند.
در الگوی طراحی از اشیاء ویژه ای به نام آداپتور (واسطه) استفاده می شود. این آداپتورها به اشیاء مورد نیاز در پروژه مرتبط می شوند. نوشتن برنامه تا حد زیادی از طریق این واسطه ها انجام می شود. الگوهای طراحی را بر اساس دو معیار طبقه بندی می کنیم.۱-اولین معیار، که مقصود نامیده شده، منعکس کننده آنچه یک الگو انجام می دهداست. یک الگو ممکن است هدف ایجادی، ساختاری یا رفتاری داشته باشد.الگوهای ایجادی پروسه ایجاد اشیاء را مورد توجه قرار می دهند.الگوهای ساختاری با ترکیب کلاس ها و اشیاء سروکار دارند.الگوهای رفتاری طرقی که اشیاء با همدیگر فعل و انفعال انجام داده و وظایف را توزیع می کنند مشخص می سازند.۲- معیار دوم، که محدوده نامیده شده، مشخص کننده اینکه الگو بر روی کلاس ها یا اشیاء اعمال می گردد.است. الگوهای در محدوده کلاس ها با ارتباطات بین کلاس ها و زیر کلاس های آن ها سر و کار دارند. این گونه ارتباطات از طریق وراثت برقرار می گردد، که بنابراین در زمان کامپایل ثابت می شوند. الگوهای در محدوده اشیاء با ارتباطات بین اشیاء سرو کار داشته که می تواند در زمان اجرا تغییر کرده و در نتیجه پویا هستند. تقریباً تمام الگوها از وراثت استفاده می کنند. بنابراین الگوهایی که با برچسب "در محدوده کلاس" معین شده اند آن هایی هستند که تنها بر روی ارتباط بین کلاس ها تأکید دارند. توجه کنید که بیشتر الگوها در محدوده اشیاء عمل می کنند.الگوهایایجادی که در محدوده کلاس ها هستند قسمتی از ایجاد اشیاء را به زیر کلاس ها محول می کنند، در حالیکه الگوهای ایجادی در محدوده اشیاء چنین عملی را به شیء دیگری محول می نمایند.الگوهای ساختاری کلاسی از وراثت برای ترکیب کلاس ها استفاده کرده در عوض الگوهای ساختاری در محدوه اشیاء روش هایی برای آمیختن اشیاء را شرح می دهند.الگوهای رفتاری کلاسی از وراثت برای تشریح الگوریتم ها و کنترل جریان اجرای برنامه ها استفاده می کنند در صورتی که الگوهای رفتاری شیئی چگونگی همکاری گروهی از اشیاء برای انجام یک وظیفه که یک شیء به تنهایی نمی تواند به انجام رساند را شرح می دهند.
بحث Design Pattern برای اولین بار در دنیای نرم افزار توسط GoF صورت گرفت. یک گروه چهار نفره شامل:Erich Gamma ،Richard Helm ،Ralph Johnson و John Vlissides ملقب به Gang of Four یا GoF هستند.
این گروه در ۲۱ اکتبر سال ۱۹۹۴ کتابی را تحت عنوان Design Patterns: Elements of Reusable Object-Oriented Software منتشر کردند. (این کتاب تا تاریخ آوریل ۲۰۰۷، سی و ۶ بار تجدید چاپ شده است)
(Adapter) رابط یک کلاس را به رابط دیگری که مورد انتظار یک مشتری است تبدیل می کند. این الگو امکان همکاری بین اشیائی که قبلاً بخاطر داشتن رابط های ناسازگار نمی توانستند با هم کار کنند را فراهم می سازد.
(Bridge) یک مفهوم مجرد را از پیاده سازی اش مجزا کرده تا هردو بتوانند به طور مستقل تغییر کنند.
(کامپوزیت) اشیاء را به صورت ساختار درختی برای ایجاد ساختار سلسله مراتبی بفرم part-whole ترکیب می نماید. این الگو اجازه می دهد تا مشتری ها اشیاء منفرد و مرکب را به صورت یکسانی پردازش کنند.
(Decorator) در زمان اجرا وظایف جدیدی به یک شی ء اضافه می کند. این الگو بدیلی قابل انعطاف برای گسترش عملکرد یک کلاس به وسیلهٔ زیر کلاس ساختن از آن را فراهم می کند.
(Facade) یک رابط منفرد برای مجموعه ای از رابط ها در یک زیر سیستم تدارک می بیند. در واقع یک facade رابط سطح بالاتری برای یک زیر سیستم تعریف کرده و باعث می شود تا زیر سیستم را به صورت ساده تری مورد استفاده قرار داد.
(Flyweight) از اشتراک منابع برای فراهم نمودن تعداد زیادی از اشیاء سبک به صورت کارا استفاده می کند.
(Proxy) یک جانشین یا جایگاه برای کنترل دسترسی به یک شیء ایجاد می کند.
در الگوی طراحی از اشیاء ویژه ای به نام آداپتور (واسطه) استفاده می شود. این آداپتورها به اشیاء مورد نیاز در پروژه مرتبط می شوند. نوشتن برنامه تا حد زیادی از طریق این واسطه ها انجام می شود. الگوهای طراحی را بر اساس دو معیار طبقه بندی می کنیم.۱-اولین معیار، که مقصود نامیده شده، منعکس کننده آنچه یک الگو انجام می دهداست. یک الگو ممکن است هدف ایجادی، ساختاری یا رفتاری داشته باشد.الگوهای ایجادی پروسه ایجاد اشیاء را مورد توجه قرار می دهند.الگوهای ساختاری با ترکیب کلاس ها و اشیاء سروکار دارند.الگوهای رفتاری طرقی که اشیاء با همدیگر فعل و انفعال انجام داده و وظایف را توزیع می کنند مشخص می سازند.۲- معیار دوم، که محدوده نامیده شده، مشخص کننده اینکه الگو بر روی کلاس ها یا اشیاء اعمال می گردد.است. الگوهای در محدوده کلاس ها با ارتباطات بین کلاس ها و زیر کلاس های آن ها سر و کار دارند. این گونه ارتباطات از طریق وراثت برقرار می گردد، که بنابراین در زمان کامپایل ثابت می شوند. الگوهای در محدوده اشیاء با ارتباطات بین اشیاء سرو کار داشته که می تواند در زمان اجرا تغییر کرده و در نتیجه پویا هستند. تقریباً تمام الگوها از وراثت استفاده می کنند. بنابراین الگوهایی که با برچسب "در محدوده کلاس" معین شده اند آن هایی هستند که تنها بر روی ارتباط بین کلاس ها تأکید دارند. توجه کنید که بیشتر الگوها در محدوده اشیاء عمل می کنند.الگوهایایجادی که در محدوده کلاس ها هستند قسمتی از ایجاد اشیاء را به زیر کلاس ها محول می کنند، در حالیکه الگوهای ایجادی در محدوده اشیاء چنین عملی را به شیء دیگری محول می نمایند.الگوهای ساختاری کلاسی از وراثت برای ترکیب کلاس ها استفاده کرده در عوض الگوهای ساختاری در محدوه اشیاء روش هایی برای آمیختن اشیاء را شرح می دهند.الگوهای رفتاری کلاسی از وراثت برای تشریح الگوریتم ها و کنترل جریان اجرای برنامه ها استفاده می کنند در صورتی که الگوهای رفتاری شیئی چگونگی همکاری گروهی از اشیاء برای انجام یک وظیفه که یک شیء به تنهایی نمی تواند به انجام رساند را شرح می دهند.
بحث Design Pattern برای اولین بار در دنیای نرم افزار توسط GoF صورت گرفت. یک گروه چهار نفره شامل:Erich Gamma ،Richard Helm ،Ralph Johnson و John Vlissides ملقب به Gang of Four یا GoF هستند.
این گروه در ۲۱ اکتبر سال ۱۹۹۴ کتابی را تحت عنوان Design Patterns: Elements of Reusable Object-Oriented Software منتشر کردند. (این کتاب تا تاریخ آوریل ۲۰۰۷، سی و ۶ بار تجدید چاپ شده است)
فرهنگستان زبان و ادب
{design pattern} [رایانه و فنّاوری اطلاعات] راه حل عمومی تکرارپذیر برای یک مسئلۀ متداول در طراحی نرم افزار
کلمات دیگر: