در مقاله دیزاین پترن چیست با دیزاین پترن ها آشنا شدیم، و در این مقاله معروفترین و پرکاربردترین دیزاین پترن هایGOF را به شما معرفی می کنیم.
تعداد 23 دیزاین پترن در سه دسته بندی ساختاری، ایجادی، رفتاری معرفی شدند. اما به ندرت پیش می آید که در یک پروژه از اکثر این دیزاین پترن ها با هم استفاده کنیم.
تعدادی از این دیزاین پترن ها کاربردهای خاصی دارند که کمتر استفاده می شوند و شاید شما هیچوقت تعدادی از این دیزاین پترن ها را استفاده نکنید. اما در مقابل تعدادی دیگر از این دیزاین پترن ها بشدت پرکاربرد هستند و شاید در اکثر پروژه ها مجبور باشید از این دیزاین پترن ها استفاده کنید.
تمام 23 دیزاین پترن بصورت کامل در دوره آموزش دیزاین پترن ها در سایت ارائه شده است.
در ادامه 7 دیزاین پترن معروف و پرکاربرد را به شما معرفی می کنیم.
1- دیزاین پترن Facade
الگوی Facade یا نمای بیرونی در دسته الگوی های ساختاری (Structural Patterns) قرار دارد.
الگویfacade به عنوان یک واسط بین زیرسیستم ها و کلاینت قرار دارد.Facade یک واسط سطح بالایی را تعریف می کند که استفاده از زیرسیستم را آسان تر می کند. به عبارت دیگر خلاصه سازی، و متمرکز سازی واسط یک سیستم شلوغ و پیچیده متشکل از تعداد زیادی کلاس و زیر سیستم به یک واسط سبک، ساده و سطح بالا.
به اینصورت با استفاده از الگوی Facade ارتباط ساب سیستم ها با کلاینت قطع میشه و ارتباط سست بین اونها برقرار میشه.
مزایا:
- سادگی: فاساد، با فراهم کردن یک واجهه یکپارچه، به کلاینتها امکان استفاده آسان از زیرسیستمها را میدهد.
- جداسازی: با جداسازی کلاینتها از زیرسیستمها، تغییرات در زیرسیستمها کمتر اثری بر کلاینتها خواهد گذاشت.
- افزایش قابلیت استفاده مجدد: با یکپارچهسازی زیرسیستمها در یک واجهه فاساد، امکان استفاده مجدد از آن در سیستمهای دیگر افزایش پیدا میکند.
مثال:
فرض کنید یک سیستم خانه هوشمند دارید که شامل چندین زیرسیستم مانند روشن و خاموش کردن چراغها، تنظیم حرارت، کنترل پردهها و ... میباشد. به جای اینکه برای هر عملیات یک تابع جداگانه فراخوانی کنید، میتوانید از یک فاساد استفاده کنید. برای مثال، وقتی میخواهید خانه را برای شب آماده کنید، تنها یک تابع مانند prepareForNight() فراخوانی میشود و فاساد مسئولیت انجام تمام کارهای مرتبط با آمادهسازی خانه برای شب (مانند خاموش کردن چراغها، کاهش حرارت، پایین آوردن پردهها و ...) را بر عهده میگیرد.
2- دیزاین پترن Adapter
Adapter، یک الگوی طراحی ساختاری است که به یک سیستم اجازه میدهد تا با واسطهای ناسازگار کار کند. اصلیترین هدف این پترن تبدیل یک واسط (interface) به واسطی دیگر است تا کلاسها بتوانند با همدیگر ارتباط برقرار کنند بدون آنکه نیاز به تغییر در کدهای آنها باشد.
پترن Adapter به یک کلاس امکان میدهد تا واسط یک کلاس دیگر را پیادهسازی کند. با استفاده از این الگو، کلاسها میتوانند با واسطهایی که در حالت عادی نمیتوانستند با آنها کار کنند، همکاری کنند.
مزایا:
- افزایش انعطافپذیری: کلاسها میتوانند با واسطهای ناسازگار کار کنند.
- باز استفاده از کد: امکان استفاده مجدد از کلاسها و واسطهای موجود با کمترین تغییرات.
- جداسازی واسطها از پیادهسازیها: کد کلاینت میتواند بدون هیچ تغییری با واسطهای جدید کار کند.
مثال و کاربرد:
پلاگینها: وقتی نرمافزاری با پلاگینهای متنوعی کار میکند که از واسطهای مختلفی استفاده میکنند، میتوان از Adapter استفاده کرد تا همگی آنها را به یک واسط استاندارد تبدیل کند.
کتابخانههای ثالث: وقتی میخواهید از یک کتابخانه ثالث در نرمافزار خود استفاده کنید که واسط آن با واسط مورد نظر شما فرق دارد، با استفاده از یک Adapter میتوانید آن را به راحتی در نرمافزار خود ادغام کنید.
سیستمهای قدیمی: در مواردی که نیاز به ادغام یا بروزرسانی سیستمهای قدیمی با سیستمهای مدرن وجود داشته باشد، استفاده از Adapter میتواند بسیار مفید باشد تا از نوشتن مجدد کل سیستم جلوگیری شود و فقط با ایجاد یک واسط متوسط، ادغام صورت گیرد.
در بسیاری از نرمافزارها و برنامههای بزرگ که نیاز به ادغام قسمتهایی با واسطهای مختلف یا بهروزرسانی بخشهای قدیمی دارند، از پترن Adapter استفاده میشود.
3- دیزاین پترن Factory Method
Factory Method یا "روش کارخانهای" یک الگوی طراحی معماری نرمافزار در دستهبندی الگوهای ساختمانی (Creational Patterns) است. این الگو به یک کلاس اجازه میدهد که تصمیم گیری در مورد اینکه از کلاسهای فرزند کدام یک را باید نمونهسازی کند، را به یک کلاس دیگر موکول کند.
مزایا:
- انعطافپذیری بالا: با جدا کردن کد مربوط به ایجاد اشیاء از کد استفادهکننده، سیستم به راحتی قابل توسعه و تغییر میشود.
- کاهش وابستگی: کلاسها و موجودیتها به کمترین حد ممکن به هم وابسته میشوند، و به همین دلیل نگهداری و تغییرات به راحتی اعمال میشوند
- پنهان کردن منطق ایجاد اشیاء: کد استفادهکننده نیازی به آگاهی از پیچیدگیهای ایجاد یک شیء خاص ندارد.
مثال و کاربرد:
واسطهای گرافیکی: در بسیاری از کتابخانهها و فریمورکهای گرافیکی، Factory Method برای ایجاد و پیادهسازی ویجتها و اشیاء گرافیکی استفاده میشود تا به برنامهنویس اجازه دهد فقط بر روی منطق برنامه تمرکز کند و نگران پیچیدگیهای ایجاد ویجتها نباشد.
اتصال به پایگاه داده: در بسیاری از فریمورکهای توسعه نرمافزار، از Factory Method برای ایجاد اتصالهای به پایگاه داده استفاده میشود، بدون اینکه برنامهنویس نیازی به دانستن جزئیات مربوط به پایگاههای داده مختلف یا درایورهای مرتبط با آنها داشته باشد.
سیستمهای پلاگینبار: در برنامهها و نرمافزارهایی که از مکانیزم پلاگینبار استفاده میکنند، Factory Method میتواند به دینامیککردن فرآیند ایجاد اشیاء کمک کند بر اساس نوع پلاگینهای موجود.
در کل، در هر جایی که نیاز به دیدن منطق ایجاد یک شیء و جدا کردن آن از کد استفادهکننده وجود دارد، میتوان از Factory Method استفاده کرد
برای آشنای کامل با این پترن مقاله دیزاین پترن factory method را مطالعه کنید.
4- دیزاین پترن Iterator
این دیزاین پترن یکی از قدیمی ترین الگوها است وکار این الگو پیمایش لیستی از اشیاء است بدون نیاز به افشا کردن کل مجموعه.
زمانی که ما مجموعه ای از اشیاءرو در کنار هم قرار می دهیم باید نحوی پیمایش را مشخص کنیم که کلاینت ما بتوتند به راحتی آن را پیمایش کند وپردازش مورد نیازش را انجام بدهد.
در iteration ما نیاز به ساختاری داریم که object فعلی رو نگهداریم و در عین حال بدا نیم object بعدی یا قبلی (و نه کل مجموعه) چیه. در حقیقت Iterator زمانی استفاده میشود که میخواهیم در چرخه یا روند به اجزای یک مجموعه دسترسی داشته باشیم.
مزایا:
- دسترسی یکنواخت: از طریق این الگو، تمام مجموعهها، بدون توجه به ساختار داخلی آنها، به یک شکل یکنواخت قابل دسترسی هستند.
- جداسازی منطق مرور: منطق مرور از منطق مجموعه جدا میشود، به این معنی که میتوانید روی یک مجموعه با چندین مرورگر مختلف کار کنید.
- سادهتر کردن کد: به جای استفاده از حلقههای مختلف برای هر نوع مجموعه، میتوانید از یک واجهه استاندارد برای مرور تمام مجموعهها استفاده کنید.
مثال و کاربرد:
کتابخانههای مجموعه داده: بسیاری از زبانهای برنامهنویسی و کتابخانههای آنها، از Iterator برای دسترسی به مجموعهها مانند لیستها، مجموعهها، دیکشنریها و غیره استفاده میکنند.
پایگاههای داده: Iterator میتواند برای دسترسی به رکوردهای یک پایگاه داده یا جستجو در یک پایگاه داده بزرگ مورد استفاده قرار گیرد.
واسطهای گرافیکی: در برخی موارد، مرور کردن عناصر یک منو یا یک لیست در واسط کاربری با استفاده از Iterator انجام میشود.
در کل، هر جایی که بخواهید روی یک مجموعه از دادهها به ترتیبی خاص مرور کنید و نخواهید کدتان به جزئیات داخلی این مجموعه وابسته شود، میتوانید از Iterator استفاده کنید.
5- دیزاین پترن strategy
این الگوی یکی از پرکاربردترین دیزاین پترن ها است و این امکان را می دهد که ما بتوانیم الگوریتم های دینامیک را درون یک کلاس بفرستیم.
الگوی strategy این امکان را میدهد تا الگوریتم ها بر اساس موقعیت و شرایط متفاوت تغییر کنند.در این الگو خانوادهای از الگوریتم ها را تعریف میکنیم و هر یک را در کلاس جداگانه و مستقل قرار میدهیم تا قابل انتخاب یا تعویض باشند..
مزایا:
- جداسازی الگوریتمها: با استفاده از الگوی Strategy، الگوریتمها از کلاسهایی که از آنها استفاده میکنند جدا میشوند.
- تعویض آسان استراتژی: در زمان اجرا میتوان استراتژی را بدون تغییر در کد، تغییر داد.
- رعایت اصل Open/Closed: کلاسها برای افزونگی باز هستند ولی برای تغییر بستهاند. به این معنی که میتوان به آسانی استراتژیهای جدید اضافه کرد بدون تغییر در کدهای موجود.
مثال و کاربرد:
الگوریتمهای مرتبسازی: اگر یک برنامه دارای چند روش مرتبسازی مختلف باشد (مثل Bubble Sort، Quick Sort، Merge Sort)، با استفاده از Strategy میتوان به کاربر امکان انتخاب استراتژی مرتبسازی را داد.
استراتژیهای تخفیف: فرض کنید در یک فروشگاه الکترونیکی، بسته به شرایط مختلف، استراتژیهای تخفیف متفاوتی وجود دارد (تخفیف دانشجویی، تخفیف فصلی، تخفیف ویژه و...) با استفاده از الگوی Strategy میتوان هر کدام از این استراتژیها را پیادهسازی کرد.
استراتژیهای احراز هویت: در یک سیستم میتوان چندین روش احراز هویت داشت (مثل رمز عبور، تایید دو مرحلهای، احراز هویت بوسیله اثر انگشت و ...). با استفاده از الگوی Strategy میتوان به راحتی بین این روشها جابهجا شد.
در کل، هر جایی که نیاز به انتخاب بین چندین الگوریتم یا استراتژی مختلف وجود دارد، استفاده از الگوی Strategy میتواند مفید باشد.
6- دیزاین پترن Composite
الگوی Composite یک الگوی طراحی ساختاری است که به شما اجازه میدهد تا اشیاء را به شکل درختی ترکیب کنید تا یک ساختار سلسلهمراتبی ایجاد شود. در این الگو، هر دو گروه و موارد فردی به یک واجهه مشترک پاسخ میدهند، که این امر اجازه میدهد تا تعامل با گروهها و افراد به یک شکل یکنواخت انجام شود.
مزایا:
- سادگی: با استفاده از الگوی Composite، میتوان با یک موجود فردی یا ترکیبی از موجودات به یک شکل یکنواخت رفتار کرد.
- افزونگی: میتوان به راحتی موجودات جدید یا گروههای جدید را اضافه کرد.
- مدیریت ساختار سلسلهمراتبی: با استفاده از Composite، مدیریت یک ساختار سلسلهمراتبی، مانند یک درخت، ساده میشود.
مثال و کاربرد:
سیستمهای فایل: در یک سیستم فایل، یک فولدر میتواند فایلهای دیگر یا فولدرهای زیر مجموعه داشته باشد. با استفاده از الگوی Composite، هر دو فایل و فولدر به یک واجهه مشترک پاسخ میدهند.
واحدهای سازمانی: در یک سازمان، واحدهای مختلف ممکن است زیرمجموعههایی داشته باشند. به طور مثال، یک دپارتمان ممکن است چندین تیم داشته باشد و هر تیم ممکن است از چندین فرد تشکیل شده باشد. با استفاده از Composite، میتوان به آسانی با واحدها و افراد رفتار کرد.
واجههای گرافیکی: بسیاری از واجههای گرافیکی از این الگو استفاده میکنند. به عنوان مثال، یک پنجره ممکن است شامل چندین عنصر گرافیکی مانند دکمهها، نوارها، منوها و غیره باشد. با استفاده از Composite، تعامل با این عناصر به طور یکنواخت امکانپذیر میشود.
در کل، الگوی Composite وقتی مفید است که ساختار سلسلهمراتبی در دادهها یا موارد استفاده موجود باشد و بخواهید با اشیاء فردی و ترکیبی به یک شکل یکنواخت رفتار کنید.
7- دیزاین پترن Decorator
الگوی Decorator یک الگوی طراحی ساختاری است که به شما اجازه میدهد تا بدون تغییر در کد کلاسهای موجود، رفتارهای جدید به یک شیء اضافه کنید. این الگو به ویژه وقتی کاربرد دارد که میخواهیم تغییراتی در یک شیء مخصوصی ایجاد کنیم ولی نمیخواهیم کلاس اصلی را تغییر دهیم.
مزایا:
- انعطافپذیری: Decorator به شما اجازه میدهد تا به یک شیء، رفتارهای جدید را به صورت پویا در زمان اجرا اضافه کنید.
- رعایت اصل Single Responsibility Principle (SRP): با استفاده از Decorator، هر Decorator فقط یک ویژگی یا رفتار را اضافه یا تغییر میدهد، پس هر کلاس فقط یک دلیل برای تغییر دارد.
- قابل توسعه: میتوان به راحتی Decoratorهای جدید ایجاد کرد بدون تغییر در کلاسها و Decoratorهای موجود.
مثال و کاربرد:
نرمافزارهای گرافیکی: به عنوان مثال، اگر شما یک شیء تصویر داشته باشید و بخواهید فیلترها یا افکتهای مختلفی به آن اضافه کنید، میتوانید از Decoratorها استفاده کنید. هر Decorator میتواند یک فیلتر یا افکت مخصوص به خود را اعمال کند.
کامپوننتهای گرافیکی: میتوانیم با استفاده از Decoratorها ویژگیهایی مانند پرده، اسکرول یا دیگر ویژگیهای ظاهری را به کامپوننتهای گرافیکی اضافه کنیم.
نرمافزارهای جاوا: در کتابخانههای جاوا، کلاسهایی مانند BufferedInputStream یا FileInputStream که هر دو از InputStream ارثبری میکنند، مثالهایی از الگوی Decorator هستند.
در کل، هر جایی که نیاز به اضافه کردن یا تغییر رفتار یک شیء بدون تغییر در کلاس اصلی وجود دارد، استفاده از الگوی Decorator میتواند مفید باشد.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید