مقدمه ای بر Object Oriented Design Patterns
طراحی برنامه های شی گرا به خودی خود سخت است و طراحی برنامه های شی گرایی که قابل استفاده مجدد هم باشند از آن نیز سخت تر است. قابلیت استفاده مجدد برای برنامه های نوشته شده بسیار مهم است. نکته ای که طراحان خبره برای حل یک مسئله میدانند این است که نباید هر مسئله را از اول حل کرد. یعنی نباید برای حل آن از ابتدای کار شروع کنیم. بلکه باید با توجه به ابزار موجود و استفاده مجدد از آنها این کار انجام شود. آنها وقتی که یک راهحل مناسب را یافتند، آنرا دفعات زیادی استفاده خواهند کرد. این تجربه، یکی از مسائلی است که آنها را خبره میکند. در نتیجه شما الگوهایی تکراری از کلاسها و اشیاء مرتب را در بسیاری از سیستمهای شئگرا خواهید دید. هر الگو یک مشکل خاص را در طراحی نرمافزار حل میکند و باعث میشود که طراحی شئگرای ما انعطافپذیرتر، زیباتر و در نهایت قابل استفاده مجدد باشد. این الگو ها به طراحان کمک میکنند که با مبنا قرار دادن تجربیات گذشته در طرح های جدید طرحهای موفق را مجددا استفاده نمایند. طراحی که با این الگو ها آشنایی بیشتری دارد، میتواند بلافاصله برای طراحی راه حل یک مسئله جدید، آنها را بکار گیرد، بدون اینکه مجبور به کشف مجدد آنها باشد. شباهت ها میتوانند به تجسم نقاط مشترک بین الگوهای، کمک کنند. الگوهای طراحی، استفاده مجدد از طرح ها و معماری های موفق را آسانتر می کنند. بیان نمودن تکنیک های اثبات شده و کارا بصورت الگوهای طراحی، آنها را برای برنامه نویسان سیستم های جدید بسیار قابل دسترس تر می کند. الگوهای طراحی به شما کمک می کنند تا از بین انتخابهای موجود، طرح هایی را بکار گیرید که قابلیت استفاده مجدد از سیستم شما را بالا می برند و از انتخاب طرح هایی که قابلیت استفاده مجدد را کاهش می دهند، جلوگیری می کنند. بصورت ساده تر؛ الگوهای طراحی به طراح کمک می کنند تا طرح صحیح را سریعتر بیابد. هر الگو مسأله ای را شرح میدهد که در محیط ما به طور مکرر رخ داده، و سپس راه حل اصلی مسأله را شرح میدهد ، به گونهای که می توانید بیش از یک میلیون بار از این راه حل استفاده کنید، بدون این که دوبار آن را به یک طریق اجرا کنید.
انواع الگوهای طراحی یا Design Pattern
به دلیل این که الگوهای طراحی فراوانی وجود دارد نیاز به شیوه ای جهت سازماندهی آن ها داریم. در این بخش الگوهای طراحی را به گونه ای طبقه بندی می کند که بتوانیم به خانواده های الگوهای مربوطه ارجاع نمائیم. این طبقه بندی به شما کمک می کند الگوهای موجود را سریعتر بیاموزید.
Structural: این نوع از الگوها برای برطرف کردن مشکلات ساختاری استفاده از کلاسها، تبدیل اشیا به یکدیگر و … می پردازد.
Behavioral: این الگوها برای ایجاد ارتباط صحیح بین کلاسها و اشیاء استفاده میشوند و مشکلات مربوط به این ارتباطات را برطرف میسازند.
ما با دو ضابطه الگوهای طراحی را طبقه بندی می کنیم.
الف)هدف: منعکس کننده کار الگو میباشد.
الگوها می توانند دارای اهداف آفرینش(creational)، ساختاری(structural) یا رفتاری(behavioral)باشند. الگوهای آفرینش به فرآیند ایجاد اشیا مربوط می شوند. الگوهای ساختاری به ترکیب کلاس ها یا اشیا می پردازند. الگوهای رفتاری شیوه هایی را که در آن ها کلاس ها یا اشیا تعامل می کنند را مشخص کرده و وظایف را توزیع می کنند.
ب)حوزه(Scope): مشخص میکند که الگو در مرحله نخست در کلاس ها یا اشیا به کار می رود.
الگوهای کلاس به روابط میان کلاسها و کلاسهای فرعی آن ها می پردازد. این روابط به گونه ای از طریق وراثت مستقر می گردند که در زمان کامپایل ایستا باشند. الگوهای شی به روابط اشیا می پردازند که می تواند در حین اجرا تغییر کنند و پویاتر هستند.
تقریبا کلیه الگوها تا حدی از وراثت استفاده می کنند. توجه داشته باشید اغلب الگوها در حوزه شی قرار می گیرند.
- الگوهای کلاس آفرینش بخشی از آفرینش اشیا را به کلاس های فرعی واگذار می کنند، در حالیکه الگوهای شی آفرینشی آن را با شی دیگری تعویض میکنند.
- الگوهای کلاس ساختاری از وراثت جهت ساختن کلاس ها استفاده می کنند، در حالیکه الگوهای شی ساختاری به شرح راه هایی جهت نصب اشیا می پردازد.
- الگوهای کلاس رفتاری از وراثت جهت توصیف الگوریتم ها و جریان کنترل استفاده می کنند، در حالیکه الگوهای شی رفتاری شرح می دهند که چگونه یک گروه از اشیا جهت انجام وظیفه ای که هیچ شی منفردی قابل به انجام آن نیست مشارکت می کنند.
در ادامه به معرفی کوتاهی در باره ی الگوهای طراحی می پردازیم:
Abstract Factory: خانواده هایی از اشیا که اعضای خانواده به یکدیگر مرتبط هستند را تولید میکند.
Adapter: اینترفیسی ایجاد میکند که کلاسهایی که با هم مرتبط نیستند بتوانند با یکدیگر کار کنند.
Bridge: جدا ساختن قسمت پیاده سازی از قسمت انتزاعی یک کلاس برای این که دو طرف بتوانند به راحتی و مستقلا تغییر کنند.
Builder: ساخت یک شی پیچیده را به گونه ای از نمایش آن مجزا میکند که همان فرآیند ساخت میتواند نمایشهای متفاوتی ایجاد کند.
Chain of Responsibility: در قالب یک زنجیره از اشیا به درخواست کاربر پاسخ میدهد.
Command: مشخص میکند که یک عملیات(operation) چگونه انجام شود و انجام آنها را مدیریت میکند.
Composite: اشیا را در ساختارهای درختی ترکیب میکند. Composite به کاربران اجازه میدهد با اشیا منفرد و اشیا ترکیبی به طور یکسان برخورد کنند.
Decorator: مسؤولیتهای اضافی را به طور دینامیک به یک شی ضمیمه میکند. Decoratorها جایگزینی انعطاف پذیر جهت طبقه بندی فرعی برای توسعه عملکرد مهیا میکنند.
Facade: اینترفیسی یکنواخت برای مجموعه میانجیهای موجود در یک کلاس فرعی مهیا میکند. نمای خارجی، اینترفیس سطح بالاتری را تعریف میکند که استفاده از سیستم فرعی را ساده تر میکند.
Factory Method: یک اینترفیس جهت ایجاد یک شی تعیین میکند، ولی اجازه میدهد کلاسهای فرعی تصمیم بگیرند کدام کلاس را معرفی کند.
Flyweight: زمانی استفاده میشود که تعداد اشیا بسیار زیاد باشد و مدیریت آنها سخت باشد.
Interpreter: جهت تعریف گرامرهای یک زبان و تفسیر جملات استفاده میشود که تنها در طراحی کامپایلرها کاربرد دارد.
Iterator: شیوه ای جهت دسترسی به عناصر یک شی بهم پیوسته به طور متوالی تدارک میبیند بدون این که نمایش موجود را دچار مخاطره کند.
Mediator: شیئی را تعیین میکند که چگونگی تعامل یک مجموعه اشیا را در یک محفظه قرار میدهد. همچنین باعث میشود که اشیا به طور دو به دو کمتر با هم ارتباط داشته باشند و پدیده ی coupling کمتر شود.
Memento: حالت درونی یک شی را به گونه ای دقیق ذخیره میکند که بعدا بتوان شی را به این حالت بازگرداند.
Observer: یک وابستگی یک به چند میان اشیا را به گونه ای تعریف میکند که هنگامی که یک شی تغییر کند کلیه موارد وابسته به آن متوجه شده و به طور خودکار بهنگام سازی شوند.
Prototype: برای ساخت و کپی کردن شیئی جدید که خواص شی اصلی را داشته باشد.
Proxy: برای شی دیگر یک جانشین یا جای گیرنده فراهم میکند تا چگونگی دسترسی به آن را کنترل کند.
Singleton: تضمین میکند که یک کلاس فقط یک نمونه داشته باشد و یک نمونهی کلی جهت دسترسی به آن را مهیا کند.
State: به یک شی اجازه میدهد هنگامی که حالت درونی آن تغییر کرد رفتار خود را عوض کند. به نظر میرسد که شی کلاس خود را عوض میکند.
Strategy: یک خانواده از الگوریتمها را تعریف کرده، هر یک را در پوشش قرار داده و آنها را قابل تعویض میسازد. استراتژی اجازه میدهد الگوریتم به طور مستقل از کاربران که از آن استفاد میکنند متفاوت باشد.
Template Method: اسکلت بندی الگوریتم در یک عملیات را تعریف کرده، پیاده سازی بعضی مراحل را به کلاسهای فرعی میسپارد. همچنین به کلاسهای فرعی مجال میدهد بعضی مراحل یک الگوریتم را بدون تغییر ساختار الگوریتم دوباره تعریف کند.
Visitor: ویزیتور به شما مجال میدهد عملیات جدید را بدون تغییر کلاسهای عناصری که در آن کار میکند تغییر دهید.
مطالب گفته شده مقدمه ای برای آشنایی با الگوهای طراحی بود و در بخشهای بعدی به مطالعه دقیق هر کدام از الگوهای گفته شده و موارد استفاده آنها خواهیم پرداخت.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.