مقدمه design patterns

الگوهای طراحی یا design patterns یک سری روش برای حل مشکلات مشخص هست.استفاده از این الگو ها یکسری مزایایی دارد که به برخی از آن اشاره میکنمافزایش شی گراییافزایش استفاده مجددطراحی بهترافزاش قابلیت استفاده مجددنکته مهم:همیشه مجبور به استفاده از الگوهای طراحی نیستید.تقسیم بندی الگوها بر اساس کتاب gofدر کل 23 الگو وجود دارد که به 3 دسته کلی تقسیم شده اند.الگوهای ساختاری Structural Patterns : این الگوها روابط بین اشیا و مشارکت آنها برای تشکیل اشیا پیچیده تر است.الگوهای ایجادی Creational Patterns : این الگوها به ساخت اشیا و ارجاع به آنها کربوط میشوند.الگوهای رفتاری Behavioural Patterns : این الگوها به ارتباط بین اشیا به ویژه از دیدگاه مسئولیت و الگوریتم مربوط میشوند.الگو های ساختاریDecoratorProxyBridgeCompositeFlyweightAdapterFacadeاین الگو ها به روابط و تعامل بین اشیا و ترکیب شدن آنها برای شکل دادن سازه ها و اشیا پیچیده تر تمرکز دارد. الگوهای ساختاری میتوانند هنگام طراحی یک سیستم یا پس از آن در حین نگهداری و توسعه استفاده شوند.برخی از این الگوها به ویژه پس از سپری شدن چند چرخه حیات نرم افزار و اعمال تغییرات جدیدی به آن که از پیش دیده نشده بود مفید هستند.اهداف کلی این الگو ها:اضافه یا حذف یک قابلیت به طور پویا به اشیا در زمان اجرا (Decorator)یکسان سازی واسط چندین کلاس مختلف مرتبط با هم (Composite)دسترسی غیر مستقیم به اشیا از طریق اشیا واسطه و اعمال کنترل دسترسی (Proxy)انعطاف پذیر کردن توسعه ی واسط کلاس و پیاده سازی آن به طور جدا از هم(جدا کردن توسعه interface از پیاده سازی آن) (Bridge)جایزگزین کردن پیاده سازی یک کلاس در زمان اجرا با یک پیاده سازی دیگر (Bridge)فراهم کردن امکان استفاده از واسطهای ناهمگون (Adapter)کاهش مصرف منابع با فاکتورگیری از اشیا تکراری و استفاده از اشیا سبک وزن (Flyweight)ساده سازی و خلاصه سازی چندین زیر سیستم بزرگ در قالب یک لایه ساده تر - Facadeالگوهای ایجادیPrototypeFactory MethodSingletonAbstract FactoryBuilder این الگوها به ساخت اشیا و ارجاع به آنها پرداخته و با انتزاعی کردن روند نمونه سازی از کلاس ها، مسئولیت این کار را خودشان برعهده می‌گیرد. یعنی دیگر نیازی نیست کلاینت، خودش به طور صریح از یک کلاس نمونه‌سازی کند. این الگو و اتصال بین کلاس ها را تضعیف کرده و loose-coupling(اتصال ضعیف و سست) را ترویج می‌دهند و با متمرکز سازی مسئولیت ایجاد اشیا پیچیده در یک نقطه ی متمرکز ، پایبندی به اصول (تنها یک مسولیت SRP - (Single responsibility Principle و(Separation of Concerns جدا سازی دغدغه ها) - SoC را فراهم می کنند. هدف این الگوها این است که یک سیستم را از چگونگی ساخت، تشکیل و ارائه اشیاء شان جدا کنند. این الگوها انعطاف پذیری سیستم را از نظر اینکه چه کسی، چگونه و چه هنگام، فلان شی را ایجاد می کند افزایش می دهند.الگوهای creational دانش این که چه کلاس هایی توسط سیستم استفاده می شود را کپسوله کرده و جزییات نمونه سازی از آنها را پنهان می‌کنند.مطلب مهمی که برنامه نویس باید درک کند این است که ساخت یک سیستم بر اساس وراثت و نمونه سازی مستقیم از کلاس ها باعث سفت و سخت شدن سیستم و افزایش tight coupling(اتصال محکم و قوی) می شود.هدف الگوهای creational این است که این اتصال قوی و نزدیک (close coupling) را بشکنند.اهداف کلی این الگو و بدین صورت است :تسریع نمونه سازی از کلاس های سنگی (Prototype)متمرکز سازی نمونه سازی از کلاس های هم شکل (Factory Method)ایجاد کلاسی که تنها یک نمونه باید داشته باشد (Singleton)متمرکز کردن نمونه سازی از مجموعه ای از کلاس ها که می توان آنها را در قالب دسته های هم شکل تقسیم کرد (Abstract Factory) جدا کردن یک شی از روند ساخت آن (Builder) الگوهای رفتاری StrategyStateTemplate MethodChain of ResponsibilityCommandIteratorMediatorObserverVisitorInterpreterMemento نقطه تمرکز الگوهای structural و creational ایجاد اشیا است.اما الگوهای رفتاری به جنبه دیگری می پردازند. در این الگوها به الگوریتم ها، مبادله اطلاعات و رفتار کلاس ها توجه می شود. هدف این الگوها پاسخگویی به سناریوهای رایجی است که در آنها به توان رفتار یک کلاس را بر اساس یک الگو تعریف کرد. الگوهای رفتاری نحوه ی بیان تقسیم عملیات به این کلاس ها را تعریف کرده و چگونگی ارتباط بین آنها را بهبود می‌دهد.هدف کلی این الگو و بدین صورت است: قابلیت استخدام چندین الگوریتم برای انجام یک کار مشخص (Strategy)فراهم کردن رفتار پویا برای یک شی با وجود ثابت بودن واسط (Interface) آن (State)توانایی دخل و تصرف در برخی از مراحل اجرای یک الگوریتم مشخص (Template Method)فاصله انداختن بین درخواست دهنده و کسی که درخواست را اجابت میکند با ایجاد زنجیره‌ای از پاسخ دهنده ها با وظایف و مسئولیت های مختلف (Chain of Responsibility) نگهداری سابقه فرمان های اجرا شده در برنامه به منظور فراهم کردن قابلیت Undo و Rendo ی (Command) مهیاکردن قابلیت تکرار و شمارش برای اشیایی که از مجموعه ای از آیتم ها تشکیل می شوند (Iterator)متمرکز کردن منطق داخلی یک مولفه ی بزرگ در قالب یک شیء مرکزی (Mediator)توانایی آگاه کردن تعدادی از اشیا از تغییرات یک شیء دیگر (Observer)اجرای یک عملیات بر روی مجموعه ای از اشیاء ناهمگون (Visitor)ایجاد مدلی ساده برای نمایش شی گرایی جملات یک زبان (Interpreter)حفظ وضعیت یک شی در یک منبع خارجی به منظور بازیابی وضعیت شی در آینده (Memento)لینک منبع و تهیه کتاب