SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
الگوهاي طراحي 
Design Patterns 
بهروز بختياري
الگوهاي طراحي 
۲ 
بخش اول : مفاهيم شي گرايي 
اش ياء ............................... ................................. ................................ ................................ ................................ . ۵ 
۷ ...................... ................................ ................................ ................................ (Abstract Objects) اش ياءانتزا عي 
۹ .................... ................................ ................................ ................................ ................................ ( Class ) كلا س 
روابط ب ين اش ياء وكلاسها ................................ ................................ ................................ ................................ ... ۱۰ 
۱۳ .......................... ................................ ................................ ................................ ( Polymorphism ) چندشك لي 
۱۴ ............................. ................................ ................................ ................................ ( Encapsulation) نهانساز ي 
نگر شي نو به ش يگر ايي ................................ ................................ ................................ ................................ ....... ۱۶ 
بخش دوم : الگوهاي طراحي 
مقدمه ا ي برالگوها ي طرا حي ................................ ................................ ................................ ........................... ۱۷ 
۲۱ ....... ................................ ................................ ................................ ................................ Singleton Pattern 
۲۴ ......... ................................ ................................. ............................... ................................ Factory Patterns 
د ري چه ) ............................... ................................. ................................ ................................ .. ۲۶ ) Façade الگو ي 
۲۹ .......... ................................ ................................ ................................. ............................... Adapter Pattern 
۳۳ ............... ................................ ................................ ................................. ............................... State Pattern 
۳۶ ........... ................................ ................................ (Chain of Responsibility pattern) الگو ي زنج ي ره مسئو لي ت 
۴۰ ....... ................................ ................................ ................................ ................................ Template method 
۴۴ .............. ................................ ................................ ................................ (Strategy Pattern) الگو ي استرات ژ ي 
۴۷ ........ ................................ ................................ ................................ ................................ Observer Pattern 
۵۰ .......... ................................ ................................ ................................. ............................... Memento الگو ي 
۵۴ ........... ................................ ................................ ................................ ................................ Flyweight الگو ي 
۵۷ .......... ................................ ................................ ................................. ............................... Decorator الگو ي 
۶۲ ........... ................................ ................................ ................................ ................................ Mediator الگو ي 
۶۶ ......... ................................ ................................. ............................... ................................ Composite الگو ي 
۶۹.............. ................................ ................................ ................................ ................................ Iterator الگو ي
الگوهاي طراحي 
۳ 
به نام خدا 
سخني با دوستان 
اين چند صفحه، مجموعه اي از پست هاي گسسته من در چند سال قبل درباره الگوهاي طراحي در و بلاگ مهندسي نرم افزار 
بو د .كه به پيشنهاد دوستان به صورت يك فايل يكپارچه براي دانلود قرار مي دهم . من شخصاً خيلي علاقه داشتم كه حداقل در 
وبلاگ، به بررسي ۲۳ الگوي كلاسيك طراحي نرم افزار بپردازبم . ولي هرگز فرصت كاملي براي اينكار به نحو ي كه در ذهن 
داشتم بوجود نيامد . پس در نهايت تصم يم گرفتم همين مطالب را براي به اشتراك گذاشتن در ق الب يك فايل آماده كنم . شايد با 
نظرات و راهنمايي شما دوستان اين مجموعه ناقص و پر عيب را به مرور اصلاح و تكميل كنيم . لطفاً دوستان اگر نظر و ديدگاهي 
براي كامل تر كردن و اصلاح اين مجموعه دارن د، مي توانند با ايميل و وبلاگهاي زير با من در ارتباط باشند . تا به كمك هم به 
مرور اين مجموعه را كامل تر كنيم . 
behrouzlo@yahoo.com Email : 
Http://ooa.blogfa.com Weblogs : 
Http://ooad.wordpress.com
الگوهاي طراحي 
۴
الگوهاي طراحي 
۵ 
اشياء 
شما دنيا را چگونه مي بينيد ؟ 
شما دنيا را چگونه مي بينيد ؟ جواب اين سوال بستگي به ذهنيت قبلي شما دارد . يك دانشمند ممكن است دنيا را يه صورت 
ساختارهاي مولكولي ببيند . يك نفاش دنيا را در قالب اشكال و رنگ ها ببيند . و بعضي ها دنيا را به صورت مجموعه اي از اشياء و 
مواد ببينند . شايد اولين چيزي كه به ذهن شما خطور كند اين باشد كه اين سوال چه ارتباطي با متدولوژي شي گرا دارد ؟ اما اين 
نوع نگاه مهم است زيرا يك مهندس نرم افزار و برنامه نو يس بايد دنيا را در قالب اشياء ببينند تا بتوانند آنها را در قالب برنامه هاي 
كامپيوتري شبيه سازي كنند . 
يك شي چست ؟ 
يك شي مي تواند يك موجوديت فيزيكي باشد ، مانند يك كتاب ، يك صندلي . شما مي توانيد يك كتاب را توصيف كنيد ، 
آنرا بخوانيد و آنرا بخريد . 
باشد ، مانند يك كار يا زمان . با اينكه يك كار (i ntangible ) يك شي مي تو اند يك موجوديت غير فيزيكي و غير قابل لمس 
چيزي است كه شما بصورت فيزيكي نمي توانيد آنرا لمس كنيد اما مي توانيد آنرا توصيف كنيد ، روي آن بحث كنيد ، آنرا انجام 
بدهيد و تكميل كنيد . هر چيزي كه بتوانيد آن را توصيف كنيد مي تواند به عنوان يك شي در نظر گرفته شود. 
يك كتاب ، يك صندلي ، يك كار و هر شي در دنيا واقعي بوسيله دو گروه از خصوصيات مشخصي مي شوند : 
صفات ويژگيهاي يك شي را بيان مي كند . در واقع يك صفت يك ويژگي از يك شي است : (a ttributes ) ۱. صفا ت 
مانند صفت نام بر اي يك فرد . صفات توصيف كننده يك شي هستند و با استفاده از مقادير صفات مي توان وضعيت 
فعلي يك شي را بدست آورد . براي مثال يك فرد مي تواند داراي صفت تاهل باشد كه با استفاده از مقدار اين صفت 
مي توان وضعيت تاهل آن فرد را در شرايط فعلي بدست آورد . 
ي ك رفتار عملي است كه يك شي توانايي انجام دادن آن را دارد . براي مثال يك شخص مي ( behaviors): ۲. رفتار 
تواند راه برود ، بدود ، بنشيند و هزاران كار ديگري كه قادر به انجام دادن آن است كه هر كدام از اين كارها براي آن 
شخص يك رفتار محسوب مي شود . يك سوال يك كتاب مي تواند چه رفتاري داشته باشد . آيا يك كتاب قادر به 
انجام دادن كاري است تا به عنوان يك رفتار براي آن شي به حساب آيد ؟ شي كتاب در حقيقت قادر به انجام هيچ 
كاري نيست . يك ناشر براي انتشار يك كتاب كارهاي مانند ويرايش كتاب ، چاپ كتاب ، توزيع كتاب و در آخر
الگوهاي طراحي 
۶ 
فروش كتاب را انجام مي دهد . اين كارها توسط يك نفر بر روي كتاب انجام مي گيرد . متدلوژي شي گرا به ما مي 
گويد كه اين رفتارها را به جاي فردي كه اين كارها را انجام مي دهد را به شي كتاب تخصيص بدهيم.
الگوهاي طراحي 
۷ 
(Abstract Objects) اشياء انتزاعي 
توصيفي از يك شي واقعي بدون در نظر كرفتن جزئيات آن شي اس ت. (A bstract Object ) يك شي انتزاعي 
Abstract Object = Real Object – Details 
( شي انتزاعي = شي واقعي - جزئيات ) 
به عنوان مثال ما براي يك شي فرد خصوصياتي مانند نام ، نام خانوادگي ، قد و وزن را در نظر مي گيريم و از بقيه صفات مربوط به 
آن صرفنظر مي كنيم . 
يك شي انتزاعي مدلي از شي واقعي است . يك شي واقعي همه صفات و رفتارهاي تعريف شده يك شي انتزاعي را دارد همراه با 
جزئيات حذف شده از شي انتزاعي . براي مثال شي انتزاعي فرد يك مدل براي يك شخص واقعي است . شي انتزاعي مي گويد كه 
يك شخص واقعي بايد يك نام ، نام خانوادگي ، قد و وزن داشته باشد . يك شخص واقعي مقادير مرتبط با اين صفات را مشخص 
مي كند . مانند : 
نام : بهروز 
نام خانوادگي : بختياري 
قد : ۱۷۵ 
وزن : ۶۰ 
يك نمونه از شي انتزاعي است . شما مي توانيد بگويد كه يك شخص واقعي يك نمونه از فرد (R eal Object ) يك شي واقعي 
انتزاعي است . 
شي انتزاعي = يك مدل از شي واقعي 
شي واقعي = يك نمونه از شي انتزاعي 
انتزاعي كردن اشياء واقعي :
الگوهاي طراحي 
۸ 
براي مثال شما تصور كنيد كه مي خواهيد با يك فرد تماس بگيريد ، شما براي تماس با آن فرد نياز نداريد كه همه چيز را درباره 
او بدانيد و فقط با دانستن نام و شماره تلفن طرف مقابل مي توانيد با او تماس بگيريد . شما مي توانيد نام پدر ، عادات و علايق آن 
قرد را بدانيد و تمام اطلاعات دقيق و معتبر باشد ولي براي كاري كه قرار است انجام بدهيد نياز به هيچ يك از اين اطلاعات 
نداريد . شما براي انتزاعي كردن يك شي نياز داريد فقط صفات و رفتارهاي را از يك شي داشته باشيد كه براي انجام دادن كاري 
كه قرار است انجام بدهيد ضروري هستند و بقيه صفات و رفتارها را بايد حذف كنيد.
الگوهاي طراحي 
۹ 
( Class ) كلاس 
صفات و رفتارهاي مربوط به شي يك كتاب را در قسمت اول مفاهيم شي گرايي بررسي كرديم، تمامي صفات و رفتارهاي مربوط 
به اين شي كتاب را ديگر كتابها نيز دارند پس شما مي توانيد يك مجموعه از قوانين را ايجاد كنيد و براي همه كتابها نيز از آن 
استفاده كنيد . مجموعه قوانين را كلاس مي نامند . يك كلاس مجموعه اي از اشياء است .اگر مجموعه اي از اشياء داراي صفات و 
ر فتارهاي مشابه باشند، شما مي توانيد اين اشياء را در يك كلاس گروهبندي كنيد . 
است كه صفات و رفتارهاي يك شي واقعي را تعريف مي كند . يك كلاس را همانند يك (t emplate ) يك كلاس يك الگو 
تعريف مي كند . اگر شما A نيست اما چيزي را شبيه حرف A در نظر بگيريد . قالب شريني حرف A قالب شريني با شكل حرف 
بوجود مي آوريد ، اگر شما يك A را بخواهيد ، قالب شريني را بر روي خمير شريني قرار مي دهيد و يك حرف A يك حرف 
را بوجود مي آوريد و هر چند بار A ديگر را بخواهيد دوباره قالب را روي خمير قرار مي دهيد و يك حرف ديگر A حرف 
ديگر كه بخواهيد مي تو انيد اين فرايند را با همان قالب شريني تكرار كنيد . 
پارگراف بالا درباره كلاس ها نيز صادق است . هنگاميكه شما يك شي را به نمايندگي از يك كلاس مي خواهيد ، شما يك نمونه 
است همانند هنگاميكه شما قالب شريني را از روي خمير A از آن كلاس را ايجاد مي كنيد . يك نمونه شبيه حرف (i nstance ) 
بر مي داري د. 
هر نمونه شامل همان رفتارها و صفاتي است كه در كلاس تعريف شده اند ، اگر چه هر نمونه يك كپي از صفات را براي خود 
دارد.
الگوهاي طراحي 
۱۰ 
روابط بين اشياء و كلاس ها 
اشياء براي اينكه كاري انجام بدهند نياز دارند با هم كار كنند پس آنها نياز به روشي دارند كه با هم ارتباط برقرار كنند . وقتي كه 
يك مشتري بليط هاي را سفارش مي دهد، مشتري بايد يك سفارش ايجاد كند و بليط مورد نظرش را به آن سفارش اضافه كند . 
اشياء نرم افزاري كه نماينده مشتري، سفارش، بليط هستند نياز دارند تا رابطه بين اشياء دنيا واقعي را عينا تك رار كنند . 
يك ارتباط بين دو كلاس هست . (a ssociation ) رابطه بين دو شي است . يك رابطه (L ink ) يك لين ك 
رابطه بين كلاس ها (اشيا ء) به سه شكل متفاوت تقسيم مي شود : 
(a ssociation ) ۱. ارتباط 
(a ggregation ) ۲. رابطه تجمع 
( composition ) ۳. رابطه تركيب 
: ( association ) ارتباط 
بين دو شي مي باشد . يك شي بطور ساده (p eer­to­peer) 
ساده ترين شكل رابطه، ارتباط مي باشد . كه يك رابطه نظير به نظير 
درباره شي ديگر مي داند بهمان طريقي كه يك فرد ممكن است فرد ديگري را بشناشد . يك ارتباط يه يك كلاس امكان مي دهد 
تا درباره صفات و رفتارهاي كلاس ديگر بداند . 
يك سيستم شي گرا از انواع كلاس ها تشكيل شده است كه از طريق ارسال پيام ها و دريافت پاسخها با يكديگر همكاري دارند . 
هنگام اجرا، يك سيستم شي گرا، مملو از نمونه هاي مي شوند كه مطابق نوع كلاس خود مي باشند . جايي كه نمونه هاي كلاس 
پيام هاي را به نمونه هاي كلاس دي گر ارسال مي كند يك ارتباط بين آنها بوجود آمده است . 
براي مثال كلاس تحويل دار درباره صفات و رفتارهاي كلاس حساب بانكي مي داند و كلاس حساب درباره صفات و عمليات 
تحويل دار مي داند . بنابراين اين دو كلاس مي توانند پيغامهايي را به يكديگر ارسال كنند . 
:( aggregation ) رابطه تجمع 
رابطه تجمع، يك رابطه بين يك واحد كل و جزء است . در رابطه تجمع يك كلاس مي تواند شامل نمونه هاي از كلاس هاي 
ديگر نيز باشد . براي مثال يك كلاس ماشين را در نظر بگيريد، كه خود از چندين كلاس ديگر مانند يك كلاس موتور، چندين 
كلاس لاستيك و تعدادي كلاس ديگر براي ساير بخش ها تشكيل شده است.
الگوهاي طراحي 
۱۱ 
در رابطه تجمع، شي جز به شي كل وابسته نيست . شي كل و جزء در زمانهاي مختلف ايجاد و از بين مي رود يعني ممكن است شي 
جزء را ايجاد كنيد بدون اينكه شي كل را يجاد كنيد . براي مثال شي موتور و لاستيك را ايجاد مي كنيد بدون اينكه شي ماشين را 
ايجاد كنيد . يا بر عكس ممكن است شي ماشين را با اشياء كه قبلا وجود داشته اند ايجاد كنيم بدون اينكه نياز باشد همزمان با ايجاد 
ماشين، آنها را ايجاد كنيم . 
براي مثال يك كلاس براي تيم پروژه در نظر بگيريد . و يك كلاس براي كارمندان شركت در نظر بگيريد . تيم پ روژه، از كارمندان 
شركت تشكيل شده است . اما ممكن است يك تيم پروژه منحل شود در حاليكه كارمندان به كار خود در شركت ادامه مي دهند . 
:( composition ) رابطه تركيب 
رابطه تركيب، شبيه رابطه تجمع مي باشد اما با يك تفاو ت: 
در رابطه تركيب، چرخه حيات جزء نمي تواند بيش از چرخه حيات كل باشد . به عبارت ديگر شي جزء هيچ وقت نمي تواند بدون 
شي كل وجود داشته باشد، شي جزء همزمان با شي كل بوجود مي آيد و همزمان با شي كل از بين مي رود . 
براي مثال يك پنجره در سيستم عامل ويندوز را در نظر بگيريد، يك پنجره از چندين شي تشكيل شده است بعنوان م ثال 
يك منو و .... زمانيكه يك شي پنجره ايجاد مي شود همزمان با آن تمام دكمه ها ، Close ، Maximize ، Minimize دكمه 
و منو ايجاد مي شود . با بستن پنجره تمام اشياء، پنجره، دكمه ها و منو از بين مي روند . امكان ندارد بدون وجود يك شي پنجره 
يك شي منو ايجاد شود و به كاربر نمايش داده شود يا با بستن و از بين رفتن شي پنجره، شي منو از بين نرود . 
است . در يك رابطه تركيب هنگاميكه ركورد اصلي حذف (c ascading deletion ) رابطه تركيب همان حذف پخش شونده 
مي شود تمام ركورد هاي مرتبط با ركورد اصلي حذف مي شوند . 
رابطه تركيب، مستلزم چرخه هاي حيات همزمان است، به طوريكه وقتي شي، كل حذف مي شود، اشياء جز نيز حذف مي شو د. 
: (G eneralization) رابطه تعميم 
شما زمانيكه در يك سوپر ماركت قدم مي زنيد . شما مواد غذايي را بر حسب ويژگهاي آنها در قسمت هاي مختلف يك سوپر 
ماركت مشاهده مي كنيد . ميوه ها و سبزيجات در يك قسمت فروشگاه، كوشت در قسمتي ديگر از فروشگاه و خشكبار را در 
قسمتي ديگر از فروشگاه پيدا مي كنيد . همه اينها مواد غذايي هستند، اما اينها انواع مختلفي از مواد غذايي هستند .عبارت هاي " تا 
يك رابطه تعميم را بين دو كلاس نشان ميدهد .(براي مثال سيب نوعي از ميوه (" Type of " ) " نوعي از " ، (" Kind of " )" حدي
الگوهاي طراحي 
۱۲ 
است و ميوه نيز نوعي از غذا است .) در بعضي مواقع عبارت "هست يك " بيانگر رابطه تعميم است . (براي مثال سيب قرمز يك 
سيب هست .) 
ناميده مي شود .مثال سيب را در نظر بگيريد . سيب نوعي م يوه است پس سيب تمام (i nheritance ) اين نوع رابطه اغلب، وراثت 
از ميوه است زيرا آن تمام ويژگيهاي ميوه را به ارث (s pecialization ) ويژگيهاي يك ميوه را به ارث مي برد .همچنان سيب 
مي برد و همچنين سيب بعضي از ويژگيها را دارد كه فقط متعلق به سيب مي باشد و سيب را از ديگر ميوه ها متمايز مي كند . پس 
از هندوانه، سيب، هلو و همه ديگر اشياء است كه در اين گروه قرار (g eneralization ) مي توان گفت كه ميوه يك تعميم 
دارند . 
وراثت در سيستم هاي شي گرا همانند به ارث بردن مشخصات رفتاري و بدني از والدينتان است . مشخصات رفتاري و بدني، همان 
صفات و رفتارهاي يك كلاس هستند كه يك كلاس از كلاس ديگر مي تواند به ارث ببرد .وراثت زيستي يك مدل سلسله مراتبي 
بوجود مي آورد كه شما را قادر مي سازد با دنبال كردن اين سلسله مراتب و بالا رفتن در آن اجداد خودتان را بشناس د. در سيستم 
هاي شي گرا نيز دقيقا به ابن صورت است كه شما مي توانيد با دنبال كردن اين ر ابطه، كلاس مولد كلاس جاري را بدست آوري د. 
سيب قرمز يك سيب است . پس كلاس مو لد سيب قرمز ، كلاس سيب است . سيب نوعي ميوه است . پس كلاس مولد سيب، 
است . ( s uper class ) است . ميوه يك سوپر كلا س (s ub class ) كلاس ميوه است . سيب يك زير كلا س 
سوپر كلاس : يك سوپر كلاس، كلاسي است كه داراي ويژگيهاي است كه بين دو يا چند كلاس مشترك است و آنها را با آن 
كلاس ها به اشتراك گذاشته است . سيب يك سوپر كلاس براي سيب قرمز اس ت. همه صفات و رفتارهاي مشترك بين سيب قرمز 
و سيب، در كلاس سيب تعريف شده است و سيب قرمز از آن صفات و رفتارها استفاده مي كند . 
زير كلاس : يك زير كلاس، كلاسي است كه داراي ويژگيهاي است كه منحصر به آن كلاس مي باشد همراه با ويژگيهاي كه 
در يك سوپر كلاس تعريف شده است و آنها را از آن سوپر كلاس به ارث مي بر د. يك كلاس مي تواند هم سوپر كلاس باشد و 
هم يك زير كلاس . كلاس سيب يك سوپر كلاس ب راي كلاس سيب قرمز است و يك زير كلاس براي كلاس ميوه اس ت. 
كلاس انتزاعي، كلاسي است كه نمي تواند نمونه اي داشته باشد . يك كلاس : (a bstract class ) كلاس انتزاع ي 
انتزاعي بايد توسط يك كلاس به ارث برده شود تا از صفات و رفتارهاي آن استفاده شود.
الگوهاي طراحي 
۱۳ 
: (P olymorphism ) چند شكلي 
قابليت دارد كه شكل هاي مختلف به خود بگيرد .منظور از شي (t hing) چند شكلي به طور تكنيكي بدين معني است كه يك ش ي 
در جمله بالا يك متد مي باشد . و منظور از شكل، رفتاري است كه توسط آن متد انجام مي شود .چند شكلي يعني اينكه يك متد 
مي تواند داراي رفتار هاي مختلف باشد . 
ممكن است در ابتدا مفهوم چند شكلي گيج كننده باشد . اما اين سر در گمي با يك مثال از دنيا واقعي مي تواند، بطور كامل از بين 
برود . كليد روشن و خاموش كردن كامپيوتر خود را در نظر بگيريد، زمانيكه شما بخواهيد كامپيوتر خود را روشن كنيد دكمه را 
فشار مي دهيد و كامپيوتر روشن مي شو د. زمانيكه مي خواهيد كامپيوتر خود را خاموش كنيد، دكمه را فشار مي دهيد و كامپيوتر 
خاموش مي شود . 
در مثال بالا متد فشار دادن كليد در شرايط مختلف، عمليات خاصي را انجام مي دهد . اين يعني چند شكلي . يك مثال ديگر را 
بررسي مي كنيم، تصور كن يد كه در يك فروشگاه به كالاها تخفيف داده مي شود . اما براي انواع مختلف كالاها، نخفيف به روش 
متقاوتي محاسبه مي شود . در اين حالت ما يك متد تخفيف داريم اما در پياده سازي نسبت به نوع كالا، عمليات متفاوتي را براي 
محاسبه تخفيف خواهيم داشت . 
پياده سازي مي شود . تصور كنيد كه يك سوپر كلاس به (G eneralization ) چند شكلي در اغلب موارد از طريق رابطه تعميم 
نام كالا داريم كه داراي متدي به نام تخفيف مي باشد . كلاس هاي مواد غذايي، پوشاك،كتاب و ... را در نظر بگيريد .اين كلاس 
ها،زير كلاس، كلاس كالا مي باشند . كه صفات و متد هاي آن را به ارث برده اند .اما نحوه محاسبه تخفيف در كلاس هاي مختلف 
با همديگر متفاوت مي باشد .در اين حالت در هر زير كلاس متد تخفيف نسبت به عملياتي كه بايد انجام بدهد تا تخفيف را محاسبه 
كند بايد بازنويسي شود اما با همان نام قبلي تخفيف .متد تخفيف در كلاس هاي مختلف معرف رف تار جداگانه اي هست اما تخت 
همان نام قبلي تخفيف.
الگوهاي طراحي 
۱۴ 
:( E ncapsulation ) نهان سازي 
نهان سازي يك از مفاهيم شي گرايي است كه شما بصورت مكرر در زندگي روزانه از آن استفاده مي كنيد . آيا شما پو ل، 
گواهينامه رانندگي و كارت اعتباري خود را در كيف پو لتان قرار مي دهيد ؟ آيا شما خودكار ها، كاغذها و كتاب هاي خود را در 
كيف تان قرار مي دهيد و به مدرسه مي بريد؟ اگر اينگونه باشد پس شما از نهان سازي استفاده مي كنيد . نهان سازي به معني قرار 
دادن چيزهاي مرتبط به هم در داخل يك شي جديد است .براي مثال يك حساب بانكي شامل : شمار ه حساب، نام مشتري، آدرس 
مشتري، نوع حساب و موجودي مشتري مي باشد . همچنين براي يك حساب بانكي رفتارهاي مانند باز كردن حساب، بستن حساب، 
برداشت از حساب و واريز به حساب وجود دارد . شما اين اطلاعات را باهم در داخل يك شي حساب پنهان مي كنيد . 
ائده اصلي كه نهان سازي ا رائه مي دهد اين است كه رفتار يك شي بايد تا حد ممكن دور از ديد كاربر باشد . به عبارت ديگر تا 
زماني كه لازم نباشد، كاربر نبايد متوجه شود كه يك شي چگونه درخواست هاي او را انجام مي دهد . 
استفاده از يك شي : 
تصور كنيد كه شما مي خواهيد به يك فرد رانندگي ياد بده يد براي اينكار شما يك سري از اطلاعات ضروري كه بايد آن فرد 
بداند را مشخص مي كنيد .به عنوان نمونه شما اطلاعاتي درباره ترمز ، دنده ، فرمان و آيينه را به او آموزش مي دهيد . اما آيا شما 
درباره نحوه كاركرد موتور ، نحوه عملكرد سيستم ترمز نيز مطالبي را به او ياد مي دهيد؟ نه، زيرا او نيازي ندارد كه براي رانندگي 
كردن بداند كه عملكرد داخلي ماشين چگونه است . 
ناميده مي (I nterface ) اطلاعاتي كه ماشين در معرض نمايش قرار مي دهد تا يك فرد بتواند از آن استفاده كند واسط ماشين 
شود . يك واسط راهي است تا شما با يك شي ارتباط برقرار كنيد براي آنكه شما مي خواهيد از رفتارهاي آن شي استفاده كنيد . 
براي مثال هنگاميكه شما پاي خود را روي پدال گاز ماشين قرار مي دهيد ، شما به او مي گوييد كه سريعتر حركت كند . 
يك واسط همچنين به شما اجازه مي دهد تا به اطلاعاتي از آن شي دسترسي پيدا كنيد . براي مثال واسط كيلو متر شمار مقدار 
مسيري كه به كيلومتر توسط آن ماشين طي شده است را نمايش مي دهد . 
آيا يك واسط به تنهايي كاري را انجام مي دهد؟ نه، يك واسط به تنهايي كاري را انجام نمي ده د. يك واسط بدون پياده سازي 
هيچ كاري را انجام نمي دهد . شما مي توانيد با يك شي ارتباط برقرار كنيد اما آن هيچ كاري انجام نمي (i mplementation )
الگوهاي طراحي 
۱۵ 
دهد . براي مثال شما يك كنترل از راه دور تلويزيون را در نظر بگيريد اگر مدار داخلي اين شي پياده سازي نشده باشد ما با فشار 
دادن هر كدام از كليد ها هيچ عكس العملي را مشاهده نخواهيم كرد . 
براي اينكه يك شي بتو اند وظايف خود را انجام دهد، شما نياز داريد كه مكانيزمهاي را فراهم كنيد كه به عملكردهاي واسط 
جواب بدهد . براي مثال هنگامي كه شما پدال گاز را فشار مي دهيد، رفتاري كه پشت واسط قرار دارد ولي كاربر آنرا مشاهده نمي 
كند باعث خواهد شد كه گاز بيشتري به موتور ارسال ش ود و ماشين شتاب بگيرد.
الگوهاي طراحي 
۱۶ 
نگرشي نو به شي گرايي 
داستان از اين قراره كه روزي يك نفر از دهي به شهر مياد و از قضاي روزگار به يك كنسرت موسيقي ميره . در بازگشت از شهر 
در راه به مطرب ده ميرسه كه داشته با پسرش ساز و دهل ميزده . همين كه مطرب رو مي بينه بهش ميگه كه من توي شهر رفتم يك 
جايي به اسم كنسرت و كلي از همكارات رو يك جا ديدم . مطرب هم كه تا به اون روز كنسرت نديده و نشنيده بوده، با بهت مي 
پرسه كه كنسرت چيه؟ 
مرد دهاتي ميگه كه كنسرت يه جايي كه اولش كه رفتيم تو يه عده روي يه بلندي با سازهاشون نشسته بود ند و هر كي براي 
خودش هي ساز ميزد (حواستون كه هست داشتند سازهاشون رو كوك مي كردن د). بعد يكي كه اصلا ساز نداشت از در اومد تو و 
همه براش دست زدند . بعد هم روشو كرد به مطربهاي روي بلندي و شروع كرد به دستور دادن كه تو بزن و تو نزن، تو بزن، تو نزن 
و الي آخر . آخرش م به همشون گفت ديگه نزنيد . بعد هم مردم براش دوباره دست زدند و اون هي دولا و راست ميشد مي گفت من 
.» نبودم اينا بودن من نبودم اينا بودن 
ميان (collaboration) اين دقيقا تعريف يك سيستم شي گراست . دقيقا هدف يك سيستم شي گرا ايجاد هارموني معنادار 
اجزاء مستقل سيستم ب راي دست يابي به يك كاركرد مشخص است . در صورتي كه در سيستمهاي ساخت يافته رويكرد ما دقيقا 
رويكرد حل مساله بود . مساله تعريف مي شد و برنامه نويس مساله را هدف گرفته و براي حل آن با استفاده از يك سري دستورات 
خطي شروع به حل مساله م يكرد . در منطق شي گرا اجزا يك سيست م الزاما تعلقي به سيستم ندارند و مي توانند به همان صورت كه 
به ساير سيستم ها سرويس مي دهند به سيستم مورد نظر ما نيز سرويسي را ارايه كنند . تنها مساله توان طراح سيستم در ايجاد 
تشريك مساعي و يا به تعبيري همكاري مناسب ميان اجزاء مختلف سيستم است 
توجه : اين نوشته متعلق به خود من نمي باشد . و من اين نوشته را از وبلاگ در گذار عمر با ذكر منبع پست كرده بودم . به خاطر 
نحوه نگرش جالب اين نوشته باز اين نوشته را اينجا قرار دادم و باز منبع را ذكر كردم تا رسم امانتداري را به جا آورده باشم.
الگوهاي طراحي 
۱۷ 
مقدمه اي بر الگو هاي طراحي 
كسي وجود دارد كه قبلاً مسله شما را حل كرده است . 
در مهندسي نرم افزار يك الگوي طراحي، يك روش حل قابل تكرار براي مسائلي هست كه عموماً در طراحي نرم افزار با آن 
برخورد مي كنيم . يك الگوي طراحي يك قالب يا شرح براي چگونگي حل مسائلي است كه مي تواند در شرايط مختلف استفاده 
شود . يك الگوي طراحي، راه حلي است كه براي مستند سازي ارزشمند تشخيص داده شده است، بطوريكه توسعه دهند گان ديگر 
مي توانند آن را در حل مسائل مشابه به كار ببرند .همانگونه كه طراحي شي گرا ادعا مي كند كه استفاد ه مجدد از كتابخانه ها و 
قطعات را افزايش مي دهد، ادعا مي شود كه استفاده از الگو هاي طراحي، استفده مجدد از كتابخانه ها و قطعات را افزايش مي 
دهد . 
الگو ها تكنيك هايي هستند كه افراد زماني از آنها براي حل مسائل خاص استفاده كردند . و به عنوان راه حل هاي خوب شناخ ته 
شده اند . سپس اين تكنيك ها مستند سازي شده اند تا توسعه دهندگان هنگام برخورد با مسائل مشابه از اين مستندات استفاده كنند 
و مسائل خود را حل كنند . 
تاريخچه الگو هاي طراحي : 
استفاده از الگوها براي اولين بار به ذهن يك معمار به نام الكساندر خطور كرد . الكساندر با اين مشكل روبرو شد كه يك طرح 
خوب و با كيفيت براي يك ساختمان چگونه مي تواند باشد . او براي حل مشكل خود، ساختمانها، خيابانها، شهرك ها و هر مكاني 
كه يك انسان براي خودش مي سازد را مورد مطالعه و بررسي قرار داد . او كشف كرد كه بناهاي خوب از نظر طراحي داراي 
ويژگيه اي مشترك هستند . او كشف كرد كه بناهاي خوب داراي ويژگيهاي مشابه هستند واين ويژگيهاي مشابه را الگو ناميد . 
هر الگو بيانگر يك مسئله و مشكل است كه مي تواند بارها و بارها روي بدهد همراه با راه حل آن مسئله، وشما مي تواند از اين راه 
حل براي ميليون ها بار استفاده ك ند بدون نياز مجدد براي پيدا كردن راه ح ل. 
۱، بعضي از توسعه دهندگان نرم افزار با كارهاي الگساندر برخورد كردند . آنها با اين سوال روبرو شدند كه اگر در اوايل دهه ۹۹۰ 
الگو هاي طراحي معماري در اين رشته به صورت صحيح جواب مي دهد آيا مي توان الگوهاي را براي طراحي نرم افزار بوجود 
آورد . 
در نرم افزار چه مسائل وجو دارد كه بارها رخ مي دهد و تقريبا با روشهاي مشابه مي توان آنها را حل كرد؟ ·
الگوهاي طراحي 
۱۸ 
آيا امكان استفاده از مفهوم الگوها در طراحي نرم افزار وجود دارد، آيا مي توان راه حل هاي را برا اساس الگوها بعد از · 
شناسايي الگوها ايجاد كر د. 
س والات بالا، سوالاتي بودند كه توسعه دهندگان مطرح كردند و پاسخ آن را يافتند . پاسخ سوال بلي بود . مرحله بعدي شناسايي 
الگوها بود و توسعه استانداردهاي براي مستند سازي الگوها . 
در اوايل دهه ۱۹۹۰ ، افرادي زيادي روي الگوهاي طراجي كار مي كردند . اما چهار نفر به نام هاي ، گاما، جاكوبسون، هلم و 
ولسايدز بيشترين تاثير را در اين زمينه با نوشتن كتابي به نام 
داشتند . اين چهار نويسنده ، "Design Pattern: Elements of Reusable Object­Oriented 
Software" 
مشهور است . آنها در اين كتاب ائده استفاده از الگوها را در طراحي نرم افزار به كار بردند .و يك فرمت Gang of Four به 
استاندارد را براي مستندسازي الگوها ايجاد كردند . ۲۳ نوع از الگوها را دسته بندي كردند و .... به مرور زمان فرمت هاي استاندارد 
ديگري براي مستند سازي الگوها پيشهناد شد.
الگوهاي طراحي 
۱۹ 
قالب مستند سازي براي الگوهاي طراحي : 
نام الگو يك نام خوب و مفيد براي الگو 
يك جمله كوتاه و مختصر درباره چيزي كه الگو انجام مي دهد . (i ntent ) هدف 
(تعريف مسله و راه حل به صورت مختصر و مفيد ) 
نام مستعار نام هاي ديگري كه الگو با آن شناخته مي شود . 
ساختار يك نمايش گرافيكي از الگو 
اجزاء تشكيل دهنده 
(P articipants ) 
كلاس ها و اشيائ كه در الگو شركت دارند ( وجود دارن د). 
چگونه اجزاي تشكيل دهنده با هم همكاري مي كنند تا وظايفشان را (C ollaborations ) همكاريها 
انجام دهند . 
نتايج استفاده از الگوي مورد نظر (C onsequences ) نتايج 
پياده سازي تكنيك هاي براي پياده سازي الگوي مورد نظر 
نمونه كد تكه كدي براي پياده سازي يك نمونه 
الگو هاي مرتبط الگوهاي طراحي ديگري كه ارتباط نزديگ با الگوي مورد نظر 
دارند.
الگوهاي طراحي 
۲۰ 
دسته بندي الگو ها : 
همه الگو هاي كه در اين دسته قرار مي كيرند در ارتباط با روش :(C reational Pattern ) ۱ - الگوهاي بوجود آورنده 
هاي ايجاد اشياء هستند . 
اين نوع الگوها شرح مي دهند چگونه اشياء و كلاس ها مي توانند در :(S tructural Patten ) ۲ - الگوهاي ساختار ي 
ساختارهاي بزرگتر باهم تركيب شوند . 
اين نوع الگو ها روي ارتباط اش ياء با يكديگر تمركز دارن د. :(B ehavioral Pattern ) ۳ - الگوهاي رفتار ي 
Creational Structural Behavioral 
Factory Method 
Abstract Factory 
Builder 
Prototype 
Singleton 
Adapter 
Bridge 
Composite 
Decorator 
Flyweight 
Façade 
Proxy 
Interpreter 
Template Method 
Chain of Responsibility 
Command 
Iterator 
Mediator 
Memento 
Observer 
State 
Strategy 
Visitor 
فهرست الگوهاي طراحي
الگوهاي طراحي 
۲۱ 
Singleton Pattern 
اشياء زيادي وجود دارند كه ما فقط و فقط به يك نمونه آن از اشياء نياز داريم . براي مثال سيستم شما فقط مي تواند فقط يك 
را داشته باشيد يا در اداره شما فقط مي تواند يك مدير عامل وجود داشته باشد و .... حال فرض كنيد كه COM نمونه از پورت 1 
شما كلاسي داريد كه فقط بايد يك نمونه از آن ايجاد شود . شما اين مسئله را چگونه حل مي كنيد؟ 
الگوي است كه براي اينكار ايجاد شده است . يعني اطمينان از اينكه از كلاس ما فقط يك نمونه ايجاد ، Singleton Pattern 
شده است . اين الگو براي اين به كار مي رود تا ايجاد نمونه از يك كلاس را محدود كند . 
نحوه پيادسازي : 
آسانترين راه براي ايجاد كلاسي كه فقط مي تواند يك نمونه از آن ايجاد شود استفاده از يك متغيير استاتيك در داخل كلاس مي 
مي دهيم و در ساير دفعات اين متغيير True باشد . اولين نمونه اي كه از اين كلاس ايجاد مي شود ما متغيير استاتيك را مقدار 
باشد يك نمونه از شي ايجاد خواهد شد در غير اين صورت نمونه False استاتيك در سازنده تست مي شود اگر مقدارش 
جديدي از آن شي ايجاد نخواهد شد. 
VB.NET نمونه كد اول در 
تعريف كلاس 
Public Class Singleton 
Private Shared instance_flag As Boolean = False 
Private _Id As Integer 
Public Property Id() As Integer 
Get 
Return _Id 
End Get 
Set(ByVal value As Integer) 
_Id = value 
End Set 
End Property 
Public Shared Function GetInstance() As Singleton 
If (Not instance_flag) Then 
instance_flag = True 
Return New Singleton 
Else 
Return Nothing 
End If 
End Function 
End Class 
نحوه استفاده
الگوهاي طراحي 
۲۲ 
Dim Ins1, Ins2 As Singleton 
Ins1 = Singleton.GetInstance 
Ins2 = Singleton.GetInstance 
Ins1.Id = 200 
Console.WriteLine(Ins1.Id) 
Console.WriteLine(Ins2.Id) 
Ins2.Id = 123 
Console.WriteLine(Ins1.Id) 
Console.WriteLine(Ins2.Id) 
Console.ReadKey() 
خروج ي: هنگام استفاده از كلاس بالا به شيوه اي كه نوشته شد نمونه دوم از آن هيچ وقت ايجاد نخواهد شد پس تمام 
عملياتي كه نمونه دوم مي خواهد انجام دهد با خطا همراه خواهد بود . براي حل اين مشكل مي توانيم به صورت زير عمل 
كنيم . 
VB.NET نمونه کد دوم در 
تعريف كلاس 
Public Class Singleton 
Shared m_instance As Singleton 
Private _Id As String 
Public Property Id() As Integer 
Get 
Return _Id 
End Get 
Set(ByVal value As Integer) 
_Id = value 
End Set 
End Property 
Public Shared Function GetInstance() As Singleton 
If (m_instance Is Nothing) Then 
m_instance = New Singleton() 
End If 
Return (m_instance) 
End Function 
Private Sub New() 
End Sub 
End Class 
نحوه استفاده 
Dim Ins1, Ins2 As Singleton 
Ins1 = Singleton.GetInstance 
Ins2 = Singleton.GetInstance 
Ins1.Id = 200 
Console.WriteLine(Ins1.Id) 
Console.WriteLine(Ins2.Id) 
Ins2.Id = 123 
Console.WriteLine(Ins1.Id) 
Console.WriteLine(Ins2.Id) 
Console.ReadKey() 
خروجي:
الگوهاي طراحي 
۲۳ 
۲۰۰ 
۲۰۰ 
۱۲۳ 
۱۲۳
الگوهاي طراحي 
۲۴ 
Factory Patterns 
كارخان ه) ، دقيقا از معني لغوي آن مشخص است . كارخانه مكاني است كه در آن كالاها و محصولاتي توليد مي ) Factory مفهوم 
كلاسي است كه نمونه هاي از كلاس هاي ديگر را با توجه به پارامترهاي كه Factory شود . و در بحث الگوهاي طراحي، يك 
براي آن ارسال مي شود، ايجاد مي كند . 
براي ايجاد يك ذهنيت در خودتان مي توانيد تصور كنيد كه ما يك فروشگاه پوشاك داريم هر وقت كه فروشگاه به لباس خاصي 
ارسال مي كند و توليد كننده با توجه به اسامي ارسال شده آن لباس ها را (F actory ) نياز داشته باشيد . اسامي آن را به توليد كننده 
ما است كه با توجه به پارامترهاي Factory توليد كرده و به فروشگاه ارسال مي كند . در اين مثال توليد كننده همان كلاس 
ارسال شده ( ليست پوشاك مورد نظر فروشگا ه) لباس مورد نظر ( شي موزد نظ ر) را توليد مي كند و به مشتري ارسال مي كند. 
VB.NET نمونه كد اول در 
'Class Shirt 
Public Class Shirt 
Protected _Color As String 
Protected _Size As String 
Public ReadOnly Property Color() 
Get 
Return _Color 
End Get 
End Property 
Public ReadOnly Property Size() 
Get 
Return _Size 
End Get 
End Property 
End Class 
'Class Shrit_A 
Public Class Shrit_A 
Inherits Shirt 
Public Sub New() 
Me._Color = "Blue" 
Me._Size = "XL" 
End Sub 
End Class 
'Class Shrit_B 
Public Class Shirt_B 
Inherits Shirt 
Public Sub New() 
Me._Color = "Red" 
Me._Size = "M"
الگوهاي طراحي 
۲۵ 
End Sub 
End Class 
'Class Factory 
Public Class Factory 
Public Function GetShirt(ByVal Type As String) As Shirt 
If Type = "A" Then 
Return New Shrit_A() 
Else 
Return New Shirt_B() 
End If 
End Function 
End Class 
'Class Store 
Public Class Store 
Private _OrderType As String 
Public Property OrderType() 
Get 
Return _OrderType 
End Get 
Set(ByVal value) 
_OrderType = value 
End Set 
End Property 
Public Function Order() As Shirt 
Dim Ins1 As New Factory 
Dim Ins2 As Shirt = Ins1.GetShirt(_OrderType) 
Return Ins2 
End Function 
End Class 
نحوه استفاده 
Private Sub Cmd_Order_Click(ByVal sender As System.Object, ByVal eAs System 
.EventArgs) 
Dim Ins1 As New Store 
Dim INs2 As New Shirt 
Ins1.OrderType = "A" 
INs2 = Ins1.Order() 
End Sub
الگوهاي طراحي 
۲۶ 
دريچ ه) : ) Façade الگوي 
الگوي دريچه در سيستم هاي استفاده مي شود كه توسعه دهندگان مي خواهند پيچيدگي يك سيستم را در يك كلاس (در بعضي 
مواقع چند كلا س) مخفي كنند و با استفاده از اين كلاس و يا كلاس ها به عنوان واسط و ميانجي، پيچيدگي سيستم را كاهش 
دهند . 
اگر زير سيستمي حاوي چند كلاس باشد و اين كلاس ها با همديگر همكاري كنند تا سرويس هاي را كه قرار است زير سيستم 
ارائه دهد را تداراك ببينند، ريسكي در ايجاد واسط به آن زير سيستم وجود دارد . هر كلاس ممكن است چندين عمليات داشته 
باشد . زير سيستم هاي ديگر بايد توانايي ارسال پيام به نمونه هايي از هر كلاس را داشته باشند . به اين ترتيب، يك اتصال قوي بين 
زير سيستم ها به وجود مي آيد و اگر تغيير در كلاس هاي يك زير سيستم ارائه دهنده سرويس بوجود بيايد، نيازمند رديابي تمامي 
مكان ها در زير سيستم هاي هستيم كه عمليات اين كلاس ها را فراخواني كرده اند . 
مي باشد، كه واسطي را به زير سيستم ايجاد مي كند و اين كلاس به façade يك روش غلبه بر اين وضعيت، ايجاد كلاس 
عنوان نماينده زيرسيستم مورد نظر با زير سيستم هاي ديگر عمل مي كند . به اين ترتيب، تغيير در پياده سازي كلاس هاي زير 
سيستم اثر محدودي بر زير سيستم ها ي ديگر دارد . و اگر تغييري در كلاس ها صورت بگيرد، فقط لازم است نقاطي در زير سيستم 
ارسال شده اس ت. façade هاي ديگر پيدا شود كه در آنها، پيامي به نمونه هاي از كلاس 
حالا با بررسي چند مثال مي توانيم تصويري بهتري از اين الگو به دست بياوريم . 
تصور كنيد شما به عنوان مدير پروژه براي يك پروژه نسبتا بزرگ انتخاب شده ايد . در حالت اول شما خودتان وظيفه داريد 
مسئوليت تك و تك افراد پروژه را به آنها بگويد و وظايف واگذر شده به آنها را تحويل بگيريد . در اين حالت شما وظيفه داريد با 
تك و تك افراد ارتباط برقرار كنيد و همچنين براي با زخواست وظايف شما بايد نحوه ارتباط اين افراد را با يكديگر بدانيد . در 
حالت دوم يك نفر به عنوان سر گروه انتخاب مي شود و شما مسئوليت ها واگذر شده را به او اعلام مي كنيد و براي تحويل 
وظايف فقط از او بازخواست مي كنيد . حالا دو حالت را باهم مقايسه كنيد در كدام حا لت پيچيدگي و حجم كاري شما كم 
استفاده كرديم . سر گروه در اين حالت به عنوان façade است؟ البته كه حالت دوم . در حالت دوم در واقع ما از الگوي 
است. façade كلاس
الگوهاي طراحي 
۲۷ 
نحوه ارتباط مدير پروژه با اعضاء – Façade شك ل ۱ : الگوي 
براي مثال دوم در نظر بگيريد شما مسئول طراحي يك فروشگاه الكترونيكي هستيد كه در آن مشتري بايد قادر باشد براي پرداخت 
مبلغ خريد خود از كارت هاي اعتباري استفاده كند . شما به يكي از شركت هاي صادر كننده كارت اعتباري مراجعه مي كنيد و 
مي خواهيد نحوه استفاده و موارد مورد نياز براي اينكار را به شما ارائه دهد . شركت مورد نظر هيچ وقت ساختار و كلاس هاي 
مورد نظر را كه در داخل برنامه خود براي اينكارها استفاده مي كنند دقيقا به شما ارائه نمي دهد . چون اين نه به نفع شركت مورد 
نظر است نه به نفع شما، چون با اين كار پيچيدگي سيستم پرداخت دقيقا به برنامه شما نيز اضافه خواهد شد . پس چاره كار 
را به عنوان ميانجي بين برنامه شما و برنامه سيستم façade شركت مورد نظر يك كلاس . façade چيست؟ استفاده از كلاس 
پرداخت خودشان طراحي و در اختيار مشتريان خود قرار مي دهند و شما پيام هاي خود را به اين كلاس ارسال مي كند و آن نيز 
براي گرفتن و ارسال پاسخ به شما، پيام مورد نظر را به كلاس اصلي ارسال مي كند و پاسخ را از آن دريافت و به شما ارسال مي 
كند . 
براي مثال آخر فرض كنيد شما وظيفه داريد يك برنامه براي ايجاد و ارسال ايميل بنويسيد كلاس هاي كه ممكن است براي اينكار 
در نظر بگيريد مي تواند به صورت شكل زير باشد . 
اين كلاس شامل بدنه پيام خواهد بود . : MessageBody كلاس · 
در صورت نياز شامل MessageBody اين كلاس نمونه سازي مي شود تا يك كلاس : Attachment كلاس · 
فايل پيوست باشد . 
اين كلاس نمونه سازي مي شود تا شامل اطلاعات سرآيند فايل باشد : MessageHeader كلاس · 
.From,To,Subject,… مانند
الگوهاي طراحي 
۲۸ 
را به MessageHeader و MessageBody اين كلاس نمونه سازي مي شود تا دو كلاس : Message كلاس · 
هم متصل كند ( پيوند بزن د). 
اين كلاس نمونه سازي مي شود تا در صورت نياز پيام ارسالي رمز گذاري شو د. :S ecurity كلاس · 
اين كلاس نم ونه سازي مي شود تا در آخر پيام مورد نظر را به سرور مربوطه ارسال كند . : MessageSender كلاس · 
شكل زير نمودار كلاس هاي بالا را همراه با ارتباطات آنها نشان مي دهد . 
نمودار كلاس ايجاد و ارسال ايميل ،F açade شك ل ۲ :الگوي 
را مي تواند client با مشاهده تصوير بالا مي تواند حدس بزند كه كار با كلاس هاي كه براي اينكار در نظر گرفته ايد، كلاس 
بيش از حد پيچيده كند . براي استفاده از اين كلاس ها، كلاس كلاينت بايد با اين ۶ كلاس و همچنين بايد با روابط بين آنها آشنا 
استفاده كنيم يعني براي كاهش پيچيدگي از يك كلاس جديد façade باشد . دوباره براي كاهش پيچيدگي مي توانيم از الگوي 
ا س تفاده مي كنيم . طرح جديد مي تواند به شكل زير باش د. 
نمودار كلاس ايجاد و ارسال ايميل اصلاح شده ،Façade شک ل ۳: الگوي
الگوهاي طراحي 
۲۹ 
نمودار كلاس الگوي دريچه : 
نمودار كلاس الگو به صورت زير مي باش د. 
Façade شك ل ۴ : نمودار كلاس الگوي 
اجزاء تشكيل دهنده الگو : 
كلاس ها و اشياء تشكيل دهنده اين الگو عبارتند از : 
: façade كلاس · 
اين كلاس مي داند كه كلاس هاي زير سيستم بايد به پيام دريافت شده پاسخ دهند . o 
پيام هاي دريافت شده را به شي مناسب براي پاسخگوئي ارسال مي كند . o 
كلاس هاي زير سيستم : · 
آگاه نيستند . façade كلاس هاي زير سيستم از وجود كلاس o 
پاسخ مي دهند . façade به پيام هاي ارسال شده توسط كلاس o 
به كار برده بودم . ولي آقاي façade توجه : من در پست اصلي كه در وبلاگ موجود است، عنوان نما را به عنوان گزينه فارسي 
مهندس مهرداد توصبه كردند كه به جاي نما از معادل دريچه استفاده كنيم كه به كاربرد آن نيز نزديگتر باشد . 
Adapter Pattern 
الگوي است كه در دنيا واقعي نمونه هاي زيادي از اين الگو ، (A dapter Pattern ، الگوي سازگارساز (وفق دهنده، مبدل 
وجود دارد و به همين خاطر درك اين الگو زياد مشكل نخواهد بود.
الگوهاي طراحي 
۳۰ 
شما داراي دو شاخه اي به شكل زير است ولي پريز هاي برقي laptop شكل زير را در نظر بگيريد و فرض كنيد كه كامپيوتر 
كه در ديوار نصب شده است به شكلي است كه در سمت چپ تصوير نشان داده شده است . شما براي استفاده از لپ تاپ خود در 
اين محل چه كاري را انجام مي دهيد؟ 
شما مي توانيد براي حل اين مشكل از يك مبدل استفاده كنيد . كه بين دو شاخه، لپ تاپ شما و پريز برق قرار مي گيرد و شما مي 
توانيد با قرار دادن دو شاخه در مبدل و زدن مبدل به پريز از برق استفاده كنيد . در واقع مبدل، اينترفيس پريز را به گونه اي تغيير مي 
دهد كه با اينترفيسي كه لپ تاپ شما نياز دارد همخواني داشته باشد . 
مثال بالا يك مثال از دنيا واقعي بود . ولي يك وفق دهنده شي گرا چست؟ وفق دهنده هاي شي گرا دقيقا كار مشابهي را انجام مي 
دهند . آنها يك اينترفيس را به گونه اي تغيير مي دهند كه سرويس گيرنده ها انتظار آنرا دارند . 
وفق دهند هاي شي گرا : 
فرض كنيد كه شما يك سيستم نرم افزاري داريد كه نياز دارد با كتابخانه ي از كلاس هاي جديد كه مربوط به فروشندگان است 
كار كند، اما كلاس هاي جديد به گونه اي طراحي شده اند كه اينترفيس متفاوتي را نسبت به اينترفيس قبلي دارند . 
براي حل اين مشكل شما چيكار مي كنيد؟ مي توانيد سيستم نرم افزاري موجود را به گونه اي باز نويسي كنيد كه با كلاس هاس 
جديد همخواني داشته باشد . يا كلاس هاي جديد را به گونه اي تغيير مي دهيد كه با سيستم موجود همخواني داشته باشد . اما آيا 
راه حل كم هزينه تري وجود ندارد كه بدون تغيير هيچ كدام از سيستم ها، سيستم كار خود را انجام دهد . شما مي توانيد يك 
كلا س بنويسيد كه اينترفيس فروشندگان را به گونه اي تغيير بدهد كه سيستم موجود انتظار دارد.
الگوهاي طراحي 
۳۱ 
سازگار ساز، وفق دهند ه) مانند يك واسطه عمل مي كند و درخواست هاي را كه از سيستم موجود مي رسد دريافت )A dapter 
مي كند و آنها را به شكلي تغيير مي دهد و براي كلاس مورد نظر در سيستم فروشندگان ارسال مي كند كه قابل درك و اجرا براي 
آن كلاس باشد . 
تعريف شده است را نياز دارد . ولي Math را كه در اينترفيس 1 Max براي نمونه در شكل بالا كلاس كلاينت متدي به نام 
كلاس هاي كه اين اينترفيس را پياده سازي مي كنند . عملي را كه كلاس كلاينت در نظر دارد انجام نمي دهند . ولي 
پياده سازي شده است و دقيقا خواسته Imp است كه توسط كلاس 2 Maxvalue داراي عملي به نام Math اينترفيس 2 
كلاس كلاينت را انجام مي دهد ولي با يك اينترفيس ديگر . براي حل اين مشكل چه پيشنهادي داريد؟ 
استفاده مي كنيم . يعني يك كلاس جديد تعريف مي كنيم كه اينترفيسي را ، (A dapter ) براي حل اين مشكل ما از يك مبدل 
را طوري سر بار گذاري مي كنيم كه وقتي آن فراخواني مي Max كه كلاس كلاينت مي شناسد پياده سازي مي كند . ولي عمل 
را فراخواني كند . Imp از كلاس 2 Maxvalue شود . عمل 
: Adapter نمودار كلاس 
نمودار كلاس الگو به صورت زير است:
الگوهاي طراحي 
۳۲
الگوهاي طراحي 
۳۳ 
State Pattern 
حال شما چطور است؟، سوالي است كه در يك روز بارها از شما پرسيده مي شود يا شما از ديگران مي پرسيد . حال شما يك 
ويژگي ثابت شما نيست بلكه يك ويژگي پويا است كه ممكن است با توجه به رويدادهاي خارجي يا دروني تغيير كن د. و شما مي 
توانيد در مقابل يك رويداد مشابه با توجه به حالتان رفتار متفاوتي از خود نشان دهيد . 
علاوه بر خودمان اكثر اشياي كه در اطراف ما قرار دارند داراي حالت هاي متفاوتي هستند و با توجه به رويداد هاي بيروني و 
داخلي از حالت به حالت ديكر مي رو ند و رفتار متفاوتي را در هر حالت از خود بروز مي دهند . 
در حال ديدن يك فيلم هستيد . اين برنامه دكمه هاي ،W indows Media Player براي مثال فرضي كنيد با يك برنامه مانند 
دارد كه با كليك روي آنها مي توانيد برنامه را به حالت همنام با آن دكمه ببري د. پس براي اين Stop و Pause ،P lay مانند 
شي، سه حالت بالا را مي توانيد در نظر بگيري د. حال تصوير كنيد كه يك برنامه شبيه به مثال بالا را خودمان مي خواهيم بنويسيم . 
،M edia Player يكي از شيوه ها براي انجام اين كار مي تواند به اين ترتيب باشد كه ما در ابتدا تمام حالاتي را كه يك شي 
مي تواند قبول كند را جمع آوري مي كنيم . در مرحله دوم براي هر حالت يك متغيير تعريف مي كنيم و مقادير مربوط به آنها را 
مشخص مي كنيم و علاوه بر اينها يك متغيير براي نگهداري حالت فعلي شي در نظر مي گيري م. 
const int play=0; 
const int stop=1; 
const int pause=2; 
int state = stop; // حالت اوليه 
سپس تمام اعمالي و رويدادهاي كه در سيستم مي تواند رخ دهد را جمع آور مي كنيم . و در انتها يك كلاس ايجاد مي كنيم كه 
به عنوان يك ماشين حالت عمل كند، براي هر عمل يك متد ايجاد مي كنيم كه جملات شرطي را به كار مي برند تا رفتار مناسبي 
را كه در هر حالت نياز است را پياده سازي كنند . 
public void Stop() 
{ 
if (state == play) 
{ 
عمليات مورد نظر// 
} 
if (state == pause) 
{ 
عمليات مورد نظر// 
} 
if (state == stop) 
{ 
عمليات مورد نظر// 
} 
} 
روش بالا مي تواند براي پياده سازي يك شي كه داراي چندين حالت است به كار برود . ولي تصور كند كه يك حالت جديد را 
بخواهيم به شي اضافه كنيم و يا در نحوه عملكرد شي در يك حالت خاص تغيير دهيم مطمئنا كار مشكلي را خواهيم داشت . 
يك روش خوب و كارا براي پياده سازي اشياي كه در طول حيات خود مي توانند چندين حالت مختلف داشته باشند، مي تواند 
چگونه باشد؟ شايد شما پاسخ هاي خوب و بهتري بتوانيد ارائه كنيد . ولي يكي از روش ها مي تواند به صورت زير باشد:
الگوهاي طراحي 
۳۴ 
تعريف مي كنيم كه شامل يك متد براي هر عملي است كه شي مورد نظر مي تواند state ۱. در ابتدا يك اينترفيس به نام 
ا نجام دهد . 
را پياده سازي مي كند . در واقع اين state ۲. در مرحله دوم براي هر حالت شي يك كلاس تعريف مي كنيم كه اينترفيس 
كلاس مسول پاسخگويي به رويدادها است . زمانيكه شي در اين حالت قرار دارد . 
تعريف مي كنيم . سپس براي هر state در ابتدا ما يك كلاس اينترفيس به نام ،M edia Player براي نمونه در همان مثال 
را پياده سازي مي كند . براي پياده سازي هر حالت ما نياز داريم تا رفتار state حالت يك كلاس تعريف مي كنيم كه اينترفيس 
هر كلاس را مشخص كنيم هنكاميكه هر عمل فرا خواني مي شود . 
مي رسيم . اين ( M edia Player ) بعد از پياده سازي تمام حالات شي مورد نظر، به كلاس اصلي يا همان كلاس شي مورد نظر 
كلاس همان متد هاي روش اول را خواهد داشت اما با چندين تفاوت : 
۱. به جاي استفاده از متغييرهاي عددي براي هر حالت و حالت فعلي، از اشياء كه براي حالت ها تعريف كرديم استفاده مي 
كنيم . 
كد جديد كد قديمي 
public class MediaPlayer{ 
State MediaState; 
PlayState playstate; 
PauseState pausestate; 
StopState stopstate; 
MediaPlayer{ 
playstate = new PlayState(); 
new PauseState (); = pausestate 
stopstate = new StopState(); 
MediaState = stopstate; 
} 
Public class MediaPlayer{ 
const int play=0; 
const int stop=1; 
const int pause=2; 
MediaPlayer{ 
const int state = stop; // حالت اوليه 
}
الگوهاي طراحي 
۳۵ 
۲. در پياده سازي عمل ها ديگر از جملات شرطي استفاده نمي كنيم . بلكه وقتي عملي فراخواني مي شود آن عمل به كلاس 
حالت فعلي براي انجام واگذار مي شود . 
public void Stop() 
{ 
MediaState.stop(); 
} 
حالت فعلي اجاره خواهد شد بدون هيچ جمله ي شرط ي. stop اشاره گر به حالت فعلي اس ت. متد MediaState چون 
:( State Pattern) نمودار الگوي حالت 
ما تا اينجا يك الگوي حالت را بطور كامل پياده سازي كرديم . ولي دوباره نكات بالا را باهم بررسي مي كنيم . 
۱. رفتار يك شي توسط حالت داخلي آن شي مشخصي مي شود كه در مقابل رخ دادن يك رويداد مي تواند تغيير كند . 
۲. تعداد حالات يك شي را بايد بتوانيم افزايش بدهيم بدون اينكه مجبور باشيم قسمت هاي زيادي از كد را مرور كنيم يا 
تغيير دهيم . 
الگوي حالت، به يكي شي اجازه مي دهد رفتارش را زمانيكه حالت داخلي شي تغيير كند، تغيير دهد . و همچنين با در نظر گرفتن 
هر حالت به عنوان يك شي جداگانه، حالات شي را نهان سازي مي كند . و ما مي توانيم هر تعداد حالات مورد نظر را به شي 
تغيير انجام دهيم . context مربوطه اضافه كنيم بدون اينكه در پياده سازي كلاس 
.M edia Player كلاسي است كه مي تواند داراي چندين حالت داخلي باشد در مثال ما همان Context كلاس 
يك اينترفيس مشترك براي همه حالت ها تعريف مي كند . State اينترفيس 
PlayState, عمل هاي را كه شي در آن حالت انجام مي دهد، پياده سازي مي كنند .( كلاسهاي ، Concrete كلاس هاي 
(StopState,PauseState
الگوهاي طراحي 
۳۶ 
(Chain of Responsibility pattern) الگوي زنجيره مسئوليت 
يك سرويس دهنده اينترنتي را در نظر بگيريد . اين شركت داراي سه سطح پشتيباني به شرح زير براي كاربران اس ت: 
سطح ۱ : در اين سطح به مشكلات ابتدايي كاربران مانند فراموش كردن كلمه عبور كاربران و ... رسيدگي مي شود . 
سطح ۲ : اگر اعضاي گروه سطح ۱ نتوانند مشكل مورد نظر را حل كنند . مشكل براي حل به گروه سطح ۲ ارجاع داده مي شود . 
سطح ۳ : اگر اعضاي گروه ۲ نيز نتوانند مشكل مورد نظر را حل كنند . مشكل براي حل به گروه سطح ۳ ارجاع داده مي شود . در اين 
سطح براي حل مشكل يك قرار ملاقات در محل مشكل با مشتري گذاشته مي شود . 
همانطوريكه در مثال بالا مشخص است . ممكن است هر كدام از گروه ها به در خواست ارائه شده پاسخ دهند . ولي دقيقا مشخص 
نيست كدام گروه به در خواست ارائه شده پاسخ خواهد داد . اما همه گروه ها بايد شانس اين را داشته باشند كه به درخواست ارائه 
شده پاسخ دهند . اين شانس اولويت دار است . براي نمونه در مثال بالا ابتدا به تيم سطح ۱ اين شانس داده مي شود تا مشكل را حل 
كند . در صور ت عدم حل مشكل به ترتيب، شانس به تيمهاي ۲ و ۳ داده مي شود . اين امكان نيز وجود دارد كه هيچ يك از تيم ها 
نتوانند اين مشكل را حل كنند و درخواست ارائه شده بدون پاسخ بماند . 
زنجيره مسئولي ت) مي باشد . ) Chain of responsibility مثالي كه در بالا ارائه شده تقريبا تعريفي از الگوي 
در اين الگو به يك شي اجازه داده مي شود در خواستي را ارسال كند بدون اينكه بداند كدام شي يا اشياء آنرا دريافت خواهند 
كرد و به آن پاسخ خواهند داد . اين كار با ارسال درخواست به زنجيره اي از اشياء صورت مي گير د. هر شي در اين زنجيره مي 
تواند به درخواست ارائه شده پاسخ دهد يا آن را به شي بعدي در زنجيره ارسال كند . در واقع هر شي در زنجيره بعنوان يك 
پاسخگو براي درخواست ارائه شده عمل مي كند . اگر شي مورد نظر بتواند درخواست راجواب دهد، پاسخ آن را مي دهددر غير 
اينصورت آن را به شي جانشين اش ( شي بعدي در زن جير ه) ارسال مي كند . 
براي ادامه موضوع يك مثال ديگر را در نظر مي گيريم . فرض كنيد شما مسول نوشتن يك برنامه براي شبيه سازي فرآيند تائيد 
يك درخواست سفارش از يك شركت هستيد . در اين شركت، بعد از اينكه درخواستي توسط مشتري ارائه مي شود بايد در ابتدا 
توسط مدير تائيد شود و در صورت تائيد توسط مدير، جنس به مشتري فروخته خواهد شد . اين شركت داراي چهار سطح 
مديريت مي باشد و مشخص شده است كه هر مدير سفارشاتي با مبلغ چقدر را مي تواند تائيد كند . كه حد مبالغي كه مي توانند 
تائيد كنند در جدول زير مشخص شده اس ت. 
سطوح مديريت مبلغ سفارش 
مدير نمايندگي ۲۵۰۰۰ 
مدير ناحيه ۱۰۰۰۰۰ 
نايب رئيس ۲۰۰۰۰۰ 
رئيس ۴۰۰۰۰۰
الگوهاي طراحي 
۳۷ 
شما براي اينكار چه الگوي را پيشنهاد مي كنيد؟ 
اجاز ه بدهيد كار را با الگوي زنجيره مسولئيت ادامه دهيم . در ابتدا يك كلاس براي سفارش به نام سفارش خريد در نظر مي 
گيري م. 
سپس يك كلاس انتزاعي به نام مديريت سفارش تعريف مي كنيم كه داراي يك اينترفيس مشترك براي هر كدام از سطوح 
مديريت اس ت. كه نمودار كلاس مربوط به مديريت سفارش و سطوح مديريت به صورت زير خواهد بود . كه متد تعيين شي 
براي مشخص كردن شي بعدي ( شي جانشي ن) در زن جيره عمل مي كن د. ، (S etSuccessor ) جانشين 
براي تائيد يك سفارش، كارهاي زير صورت خواهد گرفت : 
۱. ايجاد يك مجموعه از اشياي كه مي توانند به درخواست هاي رسيده شده پاسخ بدهند ( سطوح مديري ت). و قرار دادن 
آنها در يك زنجيره به طور مرتب بر حسب مقاديري كه مي توانند تائيد كنند . هر يك از اين اشياء توسط 
(M ain به شي بعدي متصل مي شود . (كلاس SetSuccessor متد 
۲. يك درخواست تائيد به اولين شي موجود در زنجيره ارسال مي شود كه اين كار توسط فراخواني 
آن شي انجام مي شود . اگر مبلغ سفارش از مقدار مبلغي كه ان شي ني تواند تائيد كند كوچكتر authorize متد 
باشد، آنرا تائيد مي كند در غير اينصورت آن درخواست را به شي بعدي در زنجيره ارسال مي كند . (براي مثال در كد 
را بررسي كنيد . ) BranchManager زير مي توانيد كلاس
الگوهاي طراحي 
۳۸ 
كلاس مديريت سفارش 
abstract class RHandler 
{ 
protected RHandler successor; 
public void SetSuccessor(RHandler successor) 
{ 
جانشين شی تعيين// 
this.successor = successor; 
} 
public abstract void authorize (PurchaseRequest purchase); 
} 
كلاس مدير نمايندگي 
class BranchManager: RHandler 
{ 
public override void authorize (PurchaseRequest purchase) 
{ 
تائيد سفارش// 
if (purchase.Amount <=25000) 
{ 
} 
else if (successor != null) 
{ 
successor.ProcessRequest(RegionalDirector); 
} 
} 
} 
Main كلاس 
class MainApp 
{ 
static void Main() 
{ 
BranchManager A = new BranchManager(); 
RegionalDirector B = new RegionalDirector(); 
VicePresident C = new VicePresident(); 
President D = new President(); 
A.SetSuccessor(B); 
B.SetSuccessor(C); 
C.SetSuccessor(D); 
Purchase p = new Purchase( 1, "Order 1",15000); 
A.authorize(p); 
Purchase p = new Purchase( 2, "Order 2",110000); 
A.authorize(p); 
} 
}
الگوهاي طراحي 
۳۹ 
دياگرام كلاس الگو:
الگوهاي طراحي 
۴۰ 
Template method 
بعضي ار مردم نمي توانند زندگي را بدون قهوه تصور كنند و بعضي ديگر زندگي را بدون چاي نمي توانند تصور كنند . ولي جزء 
تشكيل دهنده اصلي هر دو كافئين است . شباهت هاي ديگر نيز بين اين دو مورد وجود دارد . روش ساخت هر دوي آنها تقريبا 
مشابه است . شما اغلب موارد به ترتيب زير عمل مي كنيد . 
دستوالعمل ساخت قهوه : 
۱. مقداري آب را مي جوشانيد . 
۲. مقدار قهوه در آب جوشانده شده مي ريزد تا دم بكشد . 
۳. فهوه را در فنجان مي ريز د. 
۴. مقداري شكر و يا شير به آن اضافه مي كنيد . 
دستورالعمل ساخت چا ي: 
۱. مقداري آب را مي جوشانيد . 
۲. مقدار چاي خشك در آب جوشانده شده مي ريزد تا دم بكشد . 
۳. چاي را در فنجان مي ريز د. 
۴. مقداري شكر به آن اضافه مي كنيد . 
اگر بخواهيم برنامه اي براي تهيه چاي و قهوه بنويسيم كلاس هاي را به صورت زير خواهيم داشت . 
كلاس قهوه 
Public Class Coffee 
' هر مرحله از دستورالعمل ساخت قهوه به عنوان يک متد در نظر گرفتهشده اس ت. 
Public Sub prepareRecipe() 
' مراحل تهيه قهوه 
boilWater() 
brewCoffeeGrinds() 
pourInCup() 
addSugereAndMilk() 
End Sub 
Public Sub boilWater() 
Console.WriteLine(" ("جوشاندن آب 
End Sub 
Public Sub brewCoffeeGrinds() 
Console.WriteLine(" ("ريختن پودر قهوه به داخل آب جوشانده شده 
End Sub 
Public Sub pourInCup() 
Console.WriteLine(" ("ريختن قهوه به فنجان 
End Sub 
Public Sub addSugereAndMilk() 
Console.WriteLine(" ("اضافه کردن شير و شکر 
End Sub 
End Class
الگوهاي طراحي 
۴۱ 
كلاس چاي 
Public Class Tea 
Public Sub prepareRecipe() 
boilWater() 
brewTea() 
pourInCup() 
addSugere() 
End Sub 
Public Sub boilWater() 
Console.WriteLine(" ("آب جوشاندن 
End Sub 
Public Sub brewTea() 
Console.WriteLine(" ("ريختن چای به داخل آب جوشانده شده 
End Sub 
Public Sub pourInCup() 
Console.WriteLine(" ("ريختن چای به فنجان 
End Sub 
Public Sub addSugere() 
Console.WriteLine(" ("اضافه کردن شکر 
End Sub 
End Class 
دقيقا مشابه يكديگر هستند . پس pourInCup و boilWater با مشاهده دو كلاس بالا مشاهده مي شود كه دو متد 
طراحي ما داراي اشتباه هست چون بعضي از كدها تكرار شده اند . پس ما بايد طراحي خود را تغيير دهيم . ما مي توانيم طراحي 
خود را به صورت زير تغيير دهيم . دو متد كاملا مشابه در كلاس پايه پياده سازي مي شود . اما چون 
در هر كلاس به صورت نتفاوت عمل مي كند . اين متد در زير كلاس هاي مربوطه پياده سازي مي prepareRecipe متد 
شود . 
طراحي بالا يك طراحي خوب است اما نمي شود طراحي را بهتر از اين كرد؟ اگر توجه كنيم متوجه مي شويم كه براي تهيه هر 
دو مورد الگوريتم يكساني را به كار مي بري م: 
۱. جوشاندن آبي 
۲. اضافه كردن چاي يا قهوه به آب جوشيده شده 
۳. ريختن نوشيدني به دست امده در فنجان
الگوهاي طراحي 
۴۲ 
۴. اضافه كردن چاشني مورد نظر به نوشيدني 
را در كلاس پايه پياده سازي كني م. prepareRecipe پس ما مي توانيم با كمي تغييرات متد 
Public Sub prepareRecipe() 
boilWater() 
brewTea() 
pourInCup() 
addSugere() 
End Sub 
Public Sub prepareRecipe() 
boilWater() 
brewCoffeeGrinds() 
pourInCup() 
addSugereAndMilk() 
End Sub 
همانطوريكه مي توانيد مشاهده كنيد كلاس مر بوط به قهوه متدهاي به 
را استفاده مي كند در حاليكه كلاس مربوط به چاي از addSugereAndMilk و brewCoffeeGrinds نام 
استفاده مي كند . يك راه حل اين است كه براي هر مرحله غير مشابه يك نام addSugere و brewTea متد هاي به نام 
تغيير دهيم . و نام brew را به brewCoffeeGrinds و brewTea مشترك در نظر بگيريم . نام متدهاي 
تغيير مي دهيم . پس addCondiments را به addSugere و addSugereAndMilk متدهاي 
براي هر دو كلاس به صورت زير تغيير مي كند . prepareRecipe متد 
Public Sub prepareRecipe() 
boilWater() 
brew () 
pourInCup() 
addCondiments() 
End Sub 
پس حالا مي توانيم اين متد را بطور كامل به كلاس پايه منتقل كنيم و طراحي را به صورت زير تغيير دهيم . 
Template حالا ما براي اين مسله به يك طراحي ائده ال دست يافتيم . كاري كه ما براي حل اين مسله انجام داديم به نام الگوي 
از كلاس پايه درك prepareRecipe شناخته مي شود . دليل نامگذاري اين الگو را مي توانيم با مشاهده متد method
الگوهاي طراحي 
۴۳ 
يك متد است و دوما به عنوان يك قالب براي الگوريتم به كار مي رود . براي نمونه در prepareRecipe كنيم . اولين اينكه 
اين مثال شامل الگوريتم تهيه يك نوشيدني مي باشد . 
مراحل انجام يك الگوريتم را در يك متد در كلاس پايه تعريف مي كند و اجازه مي دهد زير ، Template method الگوي 
كلاس ها يك يا چند مرحله از الگوريتم را پياده سازي كنند . در واقع اسكلت يك الگوريتم در يك متد تعريف مي شو د. 
هدف ما در اين الگو، ايجاد يك قالب براي يك الگوريتم است . يك قالب يك الگوريتم را به صورت مجموعه اي از مراحل 
تعريف مي كند . هر كد ام از اين مراحل به عنوان يك متد در نظر گرفته مي شود . كه بعضي از متدها در همان كلاس پايه پياده 
در كلاس پايه در نظر گرفته مي شود و در زير كلاس ها پياده سازي مي abstract سازي مي شود و بعضي از متدها به صورت 
شود . 
: UML نمودار 
است . كه الگوي Abstract يك كلاس AbstractClass اين الگو به صورت بالا است . كه در آن كلاس UML نمودار 
است ( يك مرحله از الگوريت م) كه در Abstract يك متد primitiveOperation قالب در آن تعريف مي شود . و متد 
زير كلاس پياده سازي خواهد شد . همانطوريكه در مثال بالا مشاهده كرديم مي تواند بيش از يك 
وجود داشته باشد . اين حالت زماني رخ مي دهد كه بعضي از مراحل الگوريتم بتواند در روش هاي ConcerteClass كلاس 
مختلف پياده سازي شود.
الگوهاي طراحي 
۴۴ 
(Strategy Pattern) الگوي استراتژي 
در زندگي روزمره خود به مسائلي برخورد مي كنيم و براي غلبه بر اين مسائل ممكن است چندين راه حل پيش رو داشته باشيم . ما 
با توجه به شرايط خود يا به اجبار يكي از اين راه حل ها را انتخاب مي كنيم . در طراحي و پياده سازي يك نرم افزار نيز اين شرايط 
وجود دارد يعني جهت انجام يك عمل خاص مي توانيم از چندين الگوريتم خاص استفاده كنيم در اين حالت مي توانيم برنامه را 
طو ري طراحي كنيم كه خود برنامه به صورت پويا الگوريتم با بازدهي بالاتر را اتنخاب كند يا اين امكان را به برنامه كلاينت 
يا كاربر بدهيم تا يكي از الگوريتم ها را جهت انجام آن عمل انتخاب كند . 
براي مثال فرض كنيد كه ما در حال طراحي يك برنامه مسيريابي براي يك شبكه ه ستيم . همانطوريكه مي دانيم براي مسير يابي 
الگوريتم هاي مختلفي وجود دارد كه هر كدام داراي مزايا و معايبي هستند . و با توجه به وضعيت موجود شبكه يا عملي كه قرار 
است انجام پذيرد بايد الگوريتمي را كه داراي بالاترين كارائي است انتخاب كنيم . همچنين اين برنامه بايد ام كاني را به كاربر بدهد 
كه كارائي الگوريتم هاي مختلف را در يك شبكه فرضي بررسي كنيد . حالا طراحي پيشنهادي شما براي اين مسله چست؟ 
دوباره فرض كنيد كه در مثال بالا در بعضي از الگوريتم ها نياز داريم كه گره هاي شبكه را بر اساس فاصله ي آنها از گره مبداء 
مرتب كنيم . د وباره براي مرتب سازي الگوريتم هاي مختلف وجود دارد و هر كدام در شرايط خاص، كارائي بهتري نسبت به 
الگوريتم هاي ديگر دارد . مسئله دقيقا شبيه مسئله بالا است و اين مسله مي توانند داراي طراحي شبيه مسله بالا باش د. پس اگر ما 
بتوانيم يك طراحي خوب براي اين مسئله ارائه دهيم مي توانيم اين طراحي را براي مسائل مشابه به كار ببريم . 
هر كدام از ما مي توانيم نسبت به درك خود از مسئله و سليقه كاري، طراح هاي مختلفي براي اين مسئله ارائه دهيم . اما يك 
طراحي كه مي تواند يك جواب خوب و عالي باشد، الگوي استراتژي است كه توانسته است بارها و بارها به اين مسئله پاسخ بدهد . 
الگوي استراتژي گزينه مناسبي براي مسائلي است كه مي توانند از چندين الگوريتم مختلف به مقصود خود برسند . 
اين الگو بصورت زير اس ت: UML نمودار 
اجازه بدهيد، شيوه كار اين الگو را با مثال مربوط به مرتب سازي بررسي كنيم . فرض كنيد كه ما تصميم گرفتيم كه از سه الگويتم 
زير براي مرتب سازي استفاده كنيم.
الگوهاي طراحي 
۴۵ 
Shell Sort ۱ 
Quick Sort ۲ 
Merge Sort ۳ 
ما براي مرتب سازي در اين برنامه داراي سه استراتژي هستيم . كه هر كدام را به عنوان يك كلاس جداگانه در نظر مي گيريم 
بتواند به سادگي يك از استراتژي ها را انتخاب كنيد Client براي اينكه كلاس .(C oncreteStrategy (همان كلاس هاي 
تعريف abstract بهتر است كه تمام كلاس هاي استراتزي داراي اينترفيس مشترك باشند . براي اين كار مي توانيم يك كلاس 
كنيم و ويژگيهاي مشترك كلاس هاي استراتژي را در آن قرار دهيم و كلاس هاي استر اتژي آنها را به ارث ببرند (همان 
و پياده سازي كنند . (S trategy كلاس 
كه كلاس هاي استراتژي آنرا به ارث مي برن د. abstract كلاس 
abstract class SortStrategy 
{ 
public abstract void Sort(ArrayList list); 
} 
QuickSort کلاس مربوط به 
class QuickSort : SortStrategy 
{ 
public override void Sort(ArrayList list) 
{ 
الگوريتم مربوطه // 
} 
} 
ShellSort کلاس مربوط به 
class ShellSort : SortStrategy 
{ 
public override void Sort(ArrayList list) 
{ 
الگوريتم مربوطه // 
} 
} 
MergeSort کلاس مربوط به 
class MergeSort : SortStrategy 
{ 
public override void Sort(ArrayList list) 
{ 
الگوريتم مربوطه // 
} 
} 
كه يكي از استراتزيها را براي مرتب كردن ليست به كار مي بر د. Context كلاس 
class SortedList 
{ 
private ArrayList list = new ArrayList(); 
private SortStrategy sortstrategy; 
public void SetSortStrategy(SortStrategy sortstrategy) 
{ 
this.sortstrategy = sortstrategy;
الگوهاي طراحي 
۴۶ 
} 
public void Add(string name) 
{ 
list.Add(name); 
} 
public void Sort() 
{ 
sortstrategy.Sort(list); 
} 
}
الگوهاي طراحي 
۴۷ 
Observer Pattern 
شايد شما هم زمانيكه تلويزيون را باز مي كنيد، يا وارد اينترنت مي شود، يكراست به سراغ شبكه ها يا سايت هاي خبري مي رود، 
تا از اتفاقات و رويدادهاي مورد علاقه خود آگاه شود . حتي بعضي وقت ها اين خبرها و رويدادها باعث مي شوند شما روند كاري 
خود را تغيير ده يد . حتي بعضي از خبرها در موضوعات خاص براي شما آنقدر اهميت دارد كه، عضو يك سايت خبري مي شود تا 
هر زمانيكه خبر جديدي وجود داشته باشد، به ايميل شما نيز ارسال شود . بنابراين هر زمانيكه يك خبر جديد به سايت اضافه مي 
شود، آن خبر به ايميل شما نيز ارسال مي شود . تا زمانيكه شما از عضويت در آن سايت انصراف نداديد، همه خبرهاي جديد به شما 
ارسال مي شود، و زمانيكه شما از عضويت خود انصراف داديد، خبرهاي جديد به شما ارسال نخواهد شد ولي براي اعضاء ديگر 
سايت ارسال خواهد شد . اگر شما مسئول طراحي اين سيستم بوديد، چگونه عمل مي كرديد؟ 
يك مركز كاريابي را در نظر بگيريد، افراد مختلفي با تخصص هاي مختلف، به اين مركز مراجعه مي كنند، و با توجه به تخصص 
هايشان براي درخواست كار ثبت نام مي كنند . هر زمانيكه درخواست نيرو توسط يك شركت در يك تخصص خاص از آن 
مركز شد . آن مركز افرادي را كه در آن تخصص ث بت نام كرده اند، از آن موقعيت كاري مطلع مي كنند . اگر قرار باشد شما يك 
سيستم نرم افزاري براي اين كار طراحي كنيد، طراحي شما به چه صورت خواهد بود؟ 
هر كدام از ما مي توانيم نسبت به درك خود از مسئله و سليقه كاري، طراح هاي مختلفي براي اين مسئله ارائه دهيم . اما يك 
است كه توانسته است بارها و بارها به اين مسئله پاسخ Observer طراحي كه مي تواند يك جواب خوب و عالي باشد، الگوي 
بدهد . 
در هر دو مسئله بالا، ما يك شي داريم كه مجموعه اي از اشياء به آن وابسته هستند . هر زماني كه وضعيت شي مورد نظر تغيير مي 
هاي مي ناميم و شي را كه ديگر Observer كند، اشياء ديگر از آن تغيير آگاه مي شوند . در اين الگو، مجموعه اشياء وابسته را 
مي ناميم . براي نمونه در مثال اول، افرادي كه در سايت عضو مي شوند يك Subject اشياء به آن وابسته هستند را 
هست . Subject هستند . و شي خبر، همان Observer شي 
يك وابستگي، يك به چند بين اشياء هست، هنگاميكه شي طرف يك، وضعيتش تغيير كند، اشياء وابسته Observer الگوي 
مطلع مي شوند و وضعيت خودشان را با توجه به آن وضعيت بروز رساني مي كنند . 
مكانيزم عملكرد اين الگو بصورت زير اس ت: 
و اطلاع از (u nregistering ) و انصراف از عضويت (r egistering ) بايد يك اينترفيس براي ثبت Subject - ۱ 
تغييرات را آماده كند . 
ها ارسال observer ها براي آن ريجستر شده اند را به observer ، بايد اطلاعات حالتي را كه Subject - ۲ 
كند . 
آماده كند . Subject بايد يك اينترفيس براي دريافت پيام از Observer - ۳ 
نمودار كلاس اين الگو بصورت زير است:
الگوهاي طراحي 
۴۸ 
با يك مثال ديگر كار را ادامه مي دهيم . فرض كنيد كه در اداره شما ، در داده هاي پايگاه داده مركزي تغييرات غير مجازي، داده 
شده است . براي حل اين مشكل مديران پيشنهاد كرده اند كه هر تغييري كه در پايگاه داده مي شود، بايد توسط يك پيام، به افراد 
را در نظر مي گيريد . دقيقا بر طبق نمودار عمل مي Observer مشخص شده اي اعلام شود . شما براي حل اين مشكل، الگوي 
كنيم و با يك حالت فرض اين مثال را پياده سازي مي كنيم . 
subject اينترفيس مربوط به 
Public Interface subject 
Sub Attach(ByVal Ins As Observer) 
Sub Detach(ByVal Ins As Observer) 
Sub Notify() 
End Interface 
Observer اينترفيس مربوط به 
Public Interface Observer 
Sub Update(ByVal operation As String, ByVal record AsString) 
End Interface 
را پياده سازي مي كند . subject كه اينترفيس مربوط به database كلاس 
Public Class dataBase 
Implements subject 
Private observers As ArrayList 
Private operation As String 
Private record As String 
Public Sub New() 
observers = New ArrayList 
End Sub 
Public Sub Attach(ByVal Ins As Observer) Implementssubject.Attach 
observers.Add(Ins) 
End Sub 
Public Sub Detach(ByVal Ins As Observer) Implementssubject.Detach 
observers.Remove(observers) 
End Sub 
Private Sub Notify() Implements subject.Notify 
For I As Integer = 0 To observers.Count – 1
الگوهاي طراحي 
۴۹ 
Dim Ins As Observer = observers(i) 
Ins.Update(operation, record) 
Next 
End Sub 
Public Sub editDatabase(ByVal ope As String, ByVal rec AsString) 
Me.operation = ope 
Me.record = rec 
Notify() 
End Sub 
End Class 
را پياده سازي مي كند . Observer كه اينترفيس Archiver كلاس 
Public Class Archiver 
Implements Observer 
Public Sub Update(ByVal operation As String, ByVal recordAs String) 
Implements Observer.Update 
MessageBox.Show("The archiver says a " + operation + " operation 
was performed on " + record) 
End Sub 
End Class 
را پياده سازي مي كند . Observer كه اينترفيس boss كلاس 
Public Class Boss 
Implements Observer 
Public Sub Update(ByVal operation As String, ByVal recordAs String) 
Implements Observer.Update 
MessageBox.Show("The boss says a " + operation + " operation was 
performed on " + record) 
End Sub 
End Class 
را پياده سازي مي كند . Observer كه اينترفيس client كلاس 
Public Class client 
Implements Observer 
Public Sub Update(ByVal operation As String, ByVal recordAs String) 
Implements Observer.Update 
MessageBox.Show("The client says a " + operation + " operation 
was performed on " + record) 
End Sub 
End Class 
تست 
Dim DB As New dataBase 
Dim Ar As New Archiver 
Dim Bo As New Boss 
Dim Cl As New client 
DB.Attach(Ar) 
DB.Attach(Bo) 
DB.Attach(Cl) 
DB.editDatabase("Delete", "Record 1") 
داريم . كه هر وقت تغييري در پايگاه داده اعمال مي شود، با يك پيام به آنها اعلام مي Observer در مثال بالا، ما سه نوع 
شود.
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns
Design Patterns

Contenu connexe

Tendances

Organogenesis, in plant tissue culture
Organogenesis, in plant tissue cultureOrganogenesis, in plant tissue culture
Organogenesis, in plant tissue cultureKAUSHAL SAHU
 
protoplast culture isolation and fusion
 protoplast culture isolation and fusion protoplast culture isolation and fusion
protoplast culture isolation and fusionShrraddhaSuman
 
Single Cell Isolation
Single Cell IsolationSingle Cell Isolation
Single Cell IsolationQIAGEN
 
plant tissue culture / paper raft nurse technique
plant tissue culture / paper raft nurse techniqueplant tissue culture / paper raft nurse technique
plant tissue culture / paper raft nurse techniqueAlvin karthi
 
Ovary and ovule culture
Ovary and ovule cultureOvary and ovule culture
Ovary and ovule cultureTUPESDREAMER
 
Zero sperm count what the gynecologist should know by dr rupin shah, md
Zero sperm count   what the gynecologist should know by dr rupin shah, mdZero sperm count   what the gynecologist should know by dr rupin shah, md
Zero sperm count what the gynecologist should know by dr rupin shah, mdDr Aniruddha Malpani
 
Embryo loading & Transfer , Lifecare IVF Dr. Aruna Saxena
Embryo loading & Transfer , Lifecare IVF  Dr. Aruna Saxena Embryo loading & Transfer , Lifecare IVF  Dr. Aruna Saxena
Embryo loading & Transfer , Lifecare IVF Dr. Aruna Saxena Lifecare Centre
 
Cytoplasmic male sterility
Cytoplasmic male sterilityCytoplasmic male sterility
Cytoplasmic male sterilityvibhakhanna1
 
Recent trends in bioinformatics
Recent trends in bioinformaticsRecent trends in bioinformatics
Recent trends in bioinformaticsZeeshan Hanjra
 
Application of Matrices in real life
Application of Matrices in real lifeApplication of Matrices in real life
Application of Matrices in real lifeShayshab Azad
 
Acclimatization of plantlets
Acclimatization of plantletsAcclimatization of plantlets
Acclimatization of plantletssajal shrivastav
 
Meristem and shoot tip culture in horticultural crops
Meristem and shoot tip culture in horticultural cropsMeristem and shoot tip culture in horticultural crops
Meristem and shoot tip culture in horticultural cropsHORTIPEDIA INDIA
 

Tendances (20)

Organogenesis, in plant tissue culture
Organogenesis, in plant tissue cultureOrganogenesis, in plant tissue culture
Organogenesis, in plant tissue culture
 
protoplast culture isolation and fusion
 protoplast culture isolation and fusion protoplast culture isolation and fusion
protoplast culture isolation and fusion
 
Polyembryony
PolyembryonyPolyembryony
Polyembryony
 
Tissue regeneration of the liver
Tissue regeneration of the liverTissue regeneration of the liver
Tissue regeneration of the liver
 
Single Cell Isolation
Single Cell IsolationSingle Cell Isolation
Single Cell Isolation
 
plant tissue culture / paper raft nurse technique
plant tissue culture / paper raft nurse techniqueplant tissue culture / paper raft nurse technique
plant tissue culture / paper raft nurse technique
 
Botany:Transpiration
Botany:TranspirationBotany:Transpiration
Botany:Transpiration
 
Tissue culture
Tissue culture  Tissue culture
Tissue culture
 
Ovary and ovule culture
Ovary and ovule cultureOvary and ovule culture
Ovary and ovule culture
 
Cell culture
Cell culture Cell culture
Cell culture
 
phytochrome
phytochromephytochrome
phytochrome
 
Zero sperm count what the gynecologist should know by dr rupin shah, md
Zero sperm count   what the gynecologist should know by dr rupin shah, mdZero sperm count   what the gynecologist should know by dr rupin shah, md
Zero sperm count what the gynecologist should know by dr rupin shah, md
 
Embryo loading & Transfer , Lifecare IVF Dr. Aruna Saxena
Embryo loading & Transfer , Lifecare IVF  Dr. Aruna Saxena Embryo loading & Transfer , Lifecare IVF  Dr. Aruna Saxena
Embryo loading & Transfer , Lifecare IVF Dr. Aruna Saxena
 
Leaf culture
Leaf cultureLeaf culture
Leaf culture
 
Antisperm antibody
Antisperm antibodyAntisperm antibody
Antisperm antibody
 
Cytoplasmic male sterility
Cytoplasmic male sterilityCytoplasmic male sterility
Cytoplasmic male sterility
 
Recent trends in bioinformatics
Recent trends in bioinformaticsRecent trends in bioinformatics
Recent trends in bioinformatics
 
Application of Matrices in real life
Application of Matrices in real lifeApplication of Matrices in real life
Application of Matrices in real life
 
Acclimatization of plantlets
Acclimatization of plantletsAcclimatization of plantlets
Acclimatization of plantlets
 
Meristem and shoot tip culture in horticultural crops
Meristem and shoot tip culture in horticultural cropsMeristem and shoot tip culture in horticultural crops
Meristem and shoot tip culture in horticultural crops
 

Design Patterns

  • 1. الگوهاي طراحي Design Patterns بهروز بختياري
  • 2. الگوهاي طراحي ۲ بخش اول : مفاهيم شي گرايي اش ياء ............................... ................................. ................................ ................................ ................................ . ۵ ۷ ...................... ................................ ................................ ................................ (Abstract Objects) اش ياءانتزا عي ۹ .................... ................................ ................................ ................................ ................................ ( Class ) كلا س روابط ب ين اش ياء وكلاسها ................................ ................................ ................................ ................................ ... ۱۰ ۱۳ .......................... ................................ ................................ ................................ ( Polymorphism ) چندشك لي ۱۴ ............................. ................................ ................................ ................................ ( Encapsulation) نهانساز ي نگر شي نو به ش يگر ايي ................................ ................................ ................................ ................................ ....... ۱۶ بخش دوم : الگوهاي طراحي مقدمه ا ي برالگوها ي طرا حي ................................ ................................ ................................ ........................... ۱۷ ۲۱ ....... ................................ ................................ ................................ ................................ Singleton Pattern ۲۴ ......... ................................ ................................. ............................... ................................ Factory Patterns د ري چه ) ............................... ................................. ................................ ................................ .. ۲۶ ) Façade الگو ي ۲۹ .......... ................................ ................................ ................................. ............................... Adapter Pattern ۳۳ ............... ................................ ................................ ................................. ............................... State Pattern ۳۶ ........... ................................ ................................ (Chain of Responsibility pattern) الگو ي زنج ي ره مسئو لي ت ۴۰ ....... ................................ ................................ ................................ ................................ Template method ۴۴ .............. ................................ ................................ ................................ (Strategy Pattern) الگو ي استرات ژ ي ۴۷ ........ ................................ ................................ ................................ ................................ Observer Pattern ۵۰ .......... ................................ ................................ ................................. ............................... Memento الگو ي ۵۴ ........... ................................ ................................ ................................ ................................ Flyweight الگو ي ۵۷ .......... ................................ ................................ ................................. ............................... Decorator الگو ي ۶۲ ........... ................................ ................................ ................................ ................................ Mediator الگو ي ۶۶ ......... ................................ ................................. ............................... ................................ Composite الگو ي ۶۹.............. ................................ ................................ ................................ ................................ Iterator الگو ي
  • 3. الگوهاي طراحي ۳ به نام خدا سخني با دوستان اين چند صفحه، مجموعه اي از پست هاي گسسته من در چند سال قبل درباره الگوهاي طراحي در و بلاگ مهندسي نرم افزار بو د .كه به پيشنهاد دوستان به صورت يك فايل يكپارچه براي دانلود قرار مي دهم . من شخصاً خيلي علاقه داشتم كه حداقل در وبلاگ، به بررسي ۲۳ الگوي كلاسيك طراحي نرم افزار بپردازبم . ولي هرگز فرصت كاملي براي اينكار به نحو ي كه در ذهن داشتم بوجود نيامد . پس در نهايت تصم يم گرفتم همين مطالب را براي به اشتراك گذاشتن در ق الب يك فايل آماده كنم . شايد با نظرات و راهنمايي شما دوستان اين مجموعه ناقص و پر عيب را به مرور اصلاح و تكميل كنيم . لطفاً دوستان اگر نظر و ديدگاهي براي كامل تر كردن و اصلاح اين مجموعه دارن د، مي توانند با ايميل و وبلاگهاي زير با من در ارتباط باشند . تا به كمك هم به مرور اين مجموعه را كامل تر كنيم . behrouzlo@yahoo.com Email : Http://ooa.blogfa.com Weblogs : Http://ooad.wordpress.com
  • 5. الگوهاي طراحي ۵ اشياء شما دنيا را چگونه مي بينيد ؟ شما دنيا را چگونه مي بينيد ؟ جواب اين سوال بستگي به ذهنيت قبلي شما دارد . يك دانشمند ممكن است دنيا را يه صورت ساختارهاي مولكولي ببيند . يك نفاش دنيا را در قالب اشكال و رنگ ها ببيند . و بعضي ها دنيا را به صورت مجموعه اي از اشياء و مواد ببينند . شايد اولين چيزي كه به ذهن شما خطور كند اين باشد كه اين سوال چه ارتباطي با متدولوژي شي گرا دارد ؟ اما اين نوع نگاه مهم است زيرا يك مهندس نرم افزار و برنامه نو يس بايد دنيا را در قالب اشياء ببينند تا بتوانند آنها را در قالب برنامه هاي كامپيوتري شبيه سازي كنند . يك شي چست ؟ يك شي مي تواند يك موجوديت فيزيكي باشد ، مانند يك كتاب ، يك صندلي . شما مي توانيد يك كتاب را توصيف كنيد ، آنرا بخوانيد و آنرا بخريد . باشد ، مانند يك كار يا زمان . با اينكه يك كار (i ntangible ) يك شي مي تو اند يك موجوديت غير فيزيكي و غير قابل لمس چيزي است كه شما بصورت فيزيكي نمي توانيد آنرا لمس كنيد اما مي توانيد آنرا توصيف كنيد ، روي آن بحث كنيد ، آنرا انجام بدهيد و تكميل كنيد . هر چيزي كه بتوانيد آن را توصيف كنيد مي تواند به عنوان يك شي در نظر گرفته شود. يك كتاب ، يك صندلي ، يك كار و هر شي در دنيا واقعي بوسيله دو گروه از خصوصيات مشخصي مي شوند : صفات ويژگيهاي يك شي را بيان مي كند . در واقع يك صفت يك ويژگي از يك شي است : (a ttributes ) ۱. صفا ت مانند صفت نام بر اي يك فرد . صفات توصيف كننده يك شي هستند و با استفاده از مقادير صفات مي توان وضعيت فعلي يك شي را بدست آورد . براي مثال يك فرد مي تواند داراي صفت تاهل باشد كه با استفاده از مقدار اين صفت مي توان وضعيت تاهل آن فرد را در شرايط فعلي بدست آورد . ي ك رفتار عملي است كه يك شي توانايي انجام دادن آن را دارد . براي مثال يك شخص مي ( behaviors): ۲. رفتار تواند راه برود ، بدود ، بنشيند و هزاران كار ديگري كه قادر به انجام دادن آن است كه هر كدام از اين كارها براي آن شخص يك رفتار محسوب مي شود . يك سوال يك كتاب مي تواند چه رفتاري داشته باشد . آيا يك كتاب قادر به انجام دادن كاري است تا به عنوان يك رفتار براي آن شي به حساب آيد ؟ شي كتاب در حقيقت قادر به انجام هيچ كاري نيست . يك ناشر براي انتشار يك كتاب كارهاي مانند ويرايش كتاب ، چاپ كتاب ، توزيع كتاب و در آخر
  • 6. الگوهاي طراحي ۶ فروش كتاب را انجام مي دهد . اين كارها توسط يك نفر بر روي كتاب انجام مي گيرد . متدلوژي شي گرا به ما مي گويد كه اين رفتارها را به جاي فردي كه اين كارها را انجام مي دهد را به شي كتاب تخصيص بدهيم.
  • 7. الگوهاي طراحي ۷ (Abstract Objects) اشياء انتزاعي توصيفي از يك شي واقعي بدون در نظر كرفتن جزئيات آن شي اس ت. (A bstract Object ) يك شي انتزاعي Abstract Object = Real Object – Details ( شي انتزاعي = شي واقعي - جزئيات ) به عنوان مثال ما براي يك شي فرد خصوصياتي مانند نام ، نام خانوادگي ، قد و وزن را در نظر مي گيريم و از بقيه صفات مربوط به آن صرفنظر مي كنيم . يك شي انتزاعي مدلي از شي واقعي است . يك شي واقعي همه صفات و رفتارهاي تعريف شده يك شي انتزاعي را دارد همراه با جزئيات حذف شده از شي انتزاعي . براي مثال شي انتزاعي فرد يك مدل براي يك شخص واقعي است . شي انتزاعي مي گويد كه يك شخص واقعي بايد يك نام ، نام خانوادگي ، قد و وزن داشته باشد . يك شخص واقعي مقادير مرتبط با اين صفات را مشخص مي كند . مانند : نام : بهروز نام خانوادگي : بختياري قد : ۱۷۵ وزن : ۶۰ يك نمونه از شي انتزاعي است . شما مي توانيد بگويد كه يك شخص واقعي يك نمونه از فرد (R eal Object ) يك شي واقعي انتزاعي است . شي انتزاعي = يك مدل از شي واقعي شي واقعي = يك نمونه از شي انتزاعي انتزاعي كردن اشياء واقعي :
  • 8. الگوهاي طراحي ۸ براي مثال شما تصور كنيد كه مي خواهيد با يك فرد تماس بگيريد ، شما براي تماس با آن فرد نياز نداريد كه همه چيز را درباره او بدانيد و فقط با دانستن نام و شماره تلفن طرف مقابل مي توانيد با او تماس بگيريد . شما مي توانيد نام پدر ، عادات و علايق آن قرد را بدانيد و تمام اطلاعات دقيق و معتبر باشد ولي براي كاري كه قرار است انجام بدهيد نياز به هيچ يك از اين اطلاعات نداريد . شما براي انتزاعي كردن يك شي نياز داريد فقط صفات و رفتارهاي را از يك شي داشته باشيد كه براي انجام دادن كاري كه قرار است انجام بدهيد ضروري هستند و بقيه صفات و رفتارها را بايد حذف كنيد.
  • 9. الگوهاي طراحي ۹ ( Class ) كلاس صفات و رفتارهاي مربوط به شي يك كتاب را در قسمت اول مفاهيم شي گرايي بررسي كرديم، تمامي صفات و رفتارهاي مربوط به اين شي كتاب را ديگر كتابها نيز دارند پس شما مي توانيد يك مجموعه از قوانين را ايجاد كنيد و براي همه كتابها نيز از آن استفاده كنيد . مجموعه قوانين را كلاس مي نامند . يك كلاس مجموعه اي از اشياء است .اگر مجموعه اي از اشياء داراي صفات و ر فتارهاي مشابه باشند، شما مي توانيد اين اشياء را در يك كلاس گروهبندي كنيد . است كه صفات و رفتارهاي يك شي واقعي را تعريف مي كند . يك كلاس را همانند يك (t emplate ) يك كلاس يك الگو تعريف مي كند . اگر شما A نيست اما چيزي را شبيه حرف A در نظر بگيريد . قالب شريني حرف A قالب شريني با شكل حرف بوجود مي آوريد ، اگر شما يك A را بخواهيد ، قالب شريني را بر روي خمير شريني قرار مي دهيد و يك حرف A يك حرف را بوجود مي آوريد و هر چند بار A ديگر را بخواهيد دوباره قالب را روي خمير قرار مي دهيد و يك حرف ديگر A حرف ديگر كه بخواهيد مي تو انيد اين فرايند را با همان قالب شريني تكرار كنيد . پارگراف بالا درباره كلاس ها نيز صادق است . هنگاميكه شما يك شي را به نمايندگي از يك كلاس مي خواهيد ، شما يك نمونه است همانند هنگاميكه شما قالب شريني را از روي خمير A از آن كلاس را ايجاد مي كنيد . يك نمونه شبيه حرف (i nstance ) بر مي داري د. هر نمونه شامل همان رفتارها و صفاتي است كه در كلاس تعريف شده اند ، اگر چه هر نمونه يك كپي از صفات را براي خود دارد.
  • 10. الگوهاي طراحي ۱۰ روابط بين اشياء و كلاس ها اشياء براي اينكه كاري انجام بدهند نياز دارند با هم كار كنند پس آنها نياز به روشي دارند كه با هم ارتباط برقرار كنند . وقتي كه يك مشتري بليط هاي را سفارش مي دهد، مشتري بايد يك سفارش ايجاد كند و بليط مورد نظرش را به آن سفارش اضافه كند . اشياء نرم افزاري كه نماينده مشتري، سفارش، بليط هستند نياز دارند تا رابطه بين اشياء دنيا واقعي را عينا تك رار كنند . يك ارتباط بين دو كلاس هست . (a ssociation ) رابطه بين دو شي است . يك رابطه (L ink ) يك لين ك رابطه بين كلاس ها (اشيا ء) به سه شكل متفاوت تقسيم مي شود : (a ssociation ) ۱. ارتباط (a ggregation ) ۲. رابطه تجمع ( composition ) ۳. رابطه تركيب : ( association ) ارتباط بين دو شي مي باشد . يك شي بطور ساده (p eer­to­peer) ساده ترين شكل رابطه، ارتباط مي باشد . كه يك رابطه نظير به نظير درباره شي ديگر مي داند بهمان طريقي كه يك فرد ممكن است فرد ديگري را بشناشد . يك ارتباط يه يك كلاس امكان مي دهد تا درباره صفات و رفتارهاي كلاس ديگر بداند . يك سيستم شي گرا از انواع كلاس ها تشكيل شده است كه از طريق ارسال پيام ها و دريافت پاسخها با يكديگر همكاري دارند . هنگام اجرا، يك سيستم شي گرا، مملو از نمونه هاي مي شوند كه مطابق نوع كلاس خود مي باشند . جايي كه نمونه هاي كلاس پيام هاي را به نمونه هاي كلاس دي گر ارسال مي كند يك ارتباط بين آنها بوجود آمده است . براي مثال كلاس تحويل دار درباره صفات و رفتارهاي كلاس حساب بانكي مي داند و كلاس حساب درباره صفات و عمليات تحويل دار مي داند . بنابراين اين دو كلاس مي توانند پيغامهايي را به يكديگر ارسال كنند . :( aggregation ) رابطه تجمع رابطه تجمع، يك رابطه بين يك واحد كل و جزء است . در رابطه تجمع يك كلاس مي تواند شامل نمونه هاي از كلاس هاي ديگر نيز باشد . براي مثال يك كلاس ماشين را در نظر بگيريد، كه خود از چندين كلاس ديگر مانند يك كلاس موتور، چندين كلاس لاستيك و تعدادي كلاس ديگر براي ساير بخش ها تشكيل شده است.
  • 11. الگوهاي طراحي ۱۱ در رابطه تجمع، شي جز به شي كل وابسته نيست . شي كل و جزء در زمانهاي مختلف ايجاد و از بين مي رود يعني ممكن است شي جزء را ايجاد كنيد بدون اينكه شي كل را يجاد كنيد . براي مثال شي موتور و لاستيك را ايجاد مي كنيد بدون اينكه شي ماشين را ايجاد كنيد . يا بر عكس ممكن است شي ماشين را با اشياء كه قبلا وجود داشته اند ايجاد كنيم بدون اينكه نياز باشد همزمان با ايجاد ماشين، آنها را ايجاد كنيم . براي مثال يك كلاس براي تيم پروژه در نظر بگيريد . و يك كلاس براي كارمندان شركت در نظر بگيريد . تيم پ روژه، از كارمندان شركت تشكيل شده است . اما ممكن است يك تيم پروژه منحل شود در حاليكه كارمندان به كار خود در شركت ادامه مي دهند . :( composition ) رابطه تركيب رابطه تركيب، شبيه رابطه تجمع مي باشد اما با يك تفاو ت: در رابطه تركيب، چرخه حيات جزء نمي تواند بيش از چرخه حيات كل باشد . به عبارت ديگر شي جزء هيچ وقت نمي تواند بدون شي كل وجود داشته باشد، شي جزء همزمان با شي كل بوجود مي آيد و همزمان با شي كل از بين مي رود . براي مثال يك پنجره در سيستم عامل ويندوز را در نظر بگيريد، يك پنجره از چندين شي تشكيل شده است بعنوان م ثال يك منو و .... زمانيكه يك شي پنجره ايجاد مي شود همزمان با آن تمام دكمه ها ، Close ، Maximize ، Minimize دكمه و منو ايجاد مي شود . با بستن پنجره تمام اشياء، پنجره، دكمه ها و منو از بين مي روند . امكان ندارد بدون وجود يك شي پنجره يك شي منو ايجاد شود و به كاربر نمايش داده شود يا با بستن و از بين رفتن شي پنجره، شي منو از بين نرود . است . در يك رابطه تركيب هنگاميكه ركورد اصلي حذف (c ascading deletion ) رابطه تركيب همان حذف پخش شونده مي شود تمام ركورد هاي مرتبط با ركورد اصلي حذف مي شوند . رابطه تركيب، مستلزم چرخه هاي حيات همزمان است، به طوريكه وقتي شي، كل حذف مي شود، اشياء جز نيز حذف مي شو د. : (G eneralization) رابطه تعميم شما زمانيكه در يك سوپر ماركت قدم مي زنيد . شما مواد غذايي را بر حسب ويژگهاي آنها در قسمت هاي مختلف يك سوپر ماركت مشاهده مي كنيد . ميوه ها و سبزيجات در يك قسمت فروشگاه، كوشت در قسمتي ديگر از فروشگاه و خشكبار را در قسمتي ديگر از فروشگاه پيدا مي كنيد . همه اينها مواد غذايي هستند، اما اينها انواع مختلفي از مواد غذايي هستند .عبارت هاي " تا يك رابطه تعميم را بين دو كلاس نشان ميدهد .(براي مثال سيب نوعي از ميوه (" Type of " ) " نوعي از " ، (" Kind of " )" حدي
  • 12. الگوهاي طراحي ۱۲ است و ميوه نيز نوعي از غذا است .) در بعضي مواقع عبارت "هست يك " بيانگر رابطه تعميم است . (براي مثال سيب قرمز يك سيب هست .) ناميده مي شود .مثال سيب را در نظر بگيريد . سيب نوعي م يوه است پس سيب تمام (i nheritance ) اين نوع رابطه اغلب، وراثت از ميوه است زيرا آن تمام ويژگيهاي ميوه را به ارث (s pecialization ) ويژگيهاي يك ميوه را به ارث مي برد .همچنان سيب مي برد و همچنين سيب بعضي از ويژگيها را دارد كه فقط متعلق به سيب مي باشد و سيب را از ديگر ميوه ها متمايز مي كند . پس از هندوانه، سيب، هلو و همه ديگر اشياء است كه در اين گروه قرار (g eneralization ) مي توان گفت كه ميوه يك تعميم دارند . وراثت در سيستم هاي شي گرا همانند به ارث بردن مشخصات رفتاري و بدني از والدينتان است . مشخصات رفتاري و بدني، همان صفات و رفتارهاي يك كلاس هستند كه يك كلاس از كلاس ديگر مي تواند به ارث ببرد .وراثت زيستي يك مدل سلسله مراتبي بوجود مي آورد كه شما را قادر مي سازد با دنبال كردن اين سلسله مراتب و بالا رفتن در آن اجداد خودتان را بشناس د. در سيستم هاي شي گرا نيز دقيقا به ابن صورت است كه شما مي توانيد با دنبال كردن اين ر ابطه، كلاس مولد كلاس جاري را بدست آوري د. سيب قرمز يك سيب است . پس كلاس مو لد سيب قرمز ، كلاس سيب است . سيب نوعي ميوه است . پس كلاس مولد سيب، است . ( s uper class ) است . ميوه يك سوپر كلا س (s ub class ) كلاس ميوه است . سيب يك زير كلا س سوپر كلاس : يك سوپر كلاس، كلاسي است كه داراي ويژگيهاي است كه بين دو يا چند كلاس مشترك است و آنها را با آن كلاس ها به اشتراك گذاشته است . سيب يك سوپر كلاس براي سيب قرمز اس ت. همه صفات و رفتارهاي مشترك بين سيب قرمز و سيب، در كلاس سيب تعريف شده است و سيب قرمز از آن صفات و رفتارها استفاده مي كند . زير كلاس : يك زير كلاس، كلاسي است كه داراي ويژگيهاي است كه منحصر به آن كلاس مي باشد همراه با ويژگيهاي كه در يك سوپر كلاس تعريف شده است و آنها را از آن سوپر كلاس به ارث مي بر د. يك كلاس مي تواند هم سوپر كلاس باشد و هم يك زير كلاس . كلاس سيب يك سوپر كلاس ب راي كلاس سيب قرمز است و يك زير كلاس براي كلاس ميوه اس ت. كلاس انتزاعي، كلاسي است كه نمي تواند نمونه اي داشته باشد . يك كلاس : (a bstract class ) كلاس انتزاع ي انتزاعي بايد توسط يك كلاس به ارث برده شود تا از صفات و رفتارهاي آن استفاده شود.
  • 13. الگوهاي طراحي ۱۳ : (P olymorphism ) چند شكلي قابليت دارد كه شكل هاي مختلف به خود بگيرد .منظور از شي (t hing) چند شكلي به طور تكنيكي بدين معني است كه يك ش ي در جمله بالا يك متد مي باشد . و منظور از شكل، رفتاري است كه توسط آن متد انجام مي شود .چند شكلي يعني اينكه يك متد مي تواند داراي رفتار هاي مختلف باشد . ممكن است در ابتدا مفهوم چند شكلي گيج كننده باشد . اما اين سر در گمي با يك مثال از دنيا واقعي مي تواند، بطور كامل از بين برود . كليد روشن و خاموش كردن كامپيوتر خود را در نظر بگيريد، زمانيكه شما بخواهيد كامپيوتر خود را روشن كنيد دكمه را فشار مي دهيد و كامپيوتر روشن مي شو د. زمانيكه مي خواهيد كامپيوتر خود را خاموش كنيد، دكمه را فشار مي دهيد و كامپيوتر خاموش مي شود . در مثال بالا متد فشار دادن كليد در شرايط مختلف، عمليات خاصي را انجام مي دهد . اين يعني چند شكلي . يك مثال ديگر را بررسي مي كنيم، تصور كن يد كه در يك فروشگاه به كالاها تخفيف داده مي شود . اما براي انواع مختلف كالاها، نخفيف به روش متقاوتي محاسبه مي شود . در اين حالت ما يك متد تخفيف داريم اما در پياده سازي نسبت به نوع كالا، عمليات متفاوتي را براي محاسبه تخفيف خواهيم داشت . پياده سازي مي شود . تصور كنيد كه يك سوپر كلاس به (G eneralization ) چند شكلي در اغلب موارد از طريق رابطه تعميم نام كالا داريم كه داراي متدي به نام تخفيف مي باشد . كلاس هاي مواد غذايي، پوشاك،كتاب و ... را در نظر بگيريد .اين كلاس ها،زير كلاس، كلاس كالا مي باشند . كه صفات و متد هاي آن را به ارث برده اند .اما نحوه محاسبه تخفيف در كلاس هاي مختلف با همديگر متفاوت مي باشد .در اين حالت در هر زير كلاس متد تخفيف نسبت به عملياتي كه بايد انجام بدهد تا تخفيف را محاسبه كند بايد بازنويسي شود اما با همان نام قبلي تخفيف .متد تخفيف در كلاس هاي مختلف معرف رف تار جداگانه اي هست اما تخت همان نام قبلي تخفيف.
  • 14. الگوهاي طراحي ۱۴ :( E ncapsulation ) نهان سازي نهان سازي يك از مفاهيم شي گرايي است كه شما بصورت مكرر در زندگي روزانه از آن استفاده مي كنيد . آيا شما پو ل، گواهينامه رانندگي و كارت اعتباري خود را در كيف پو لتان قرار مي دهيد ؟ آيا شما خودكار ها، كاغذها و كتاب هاي خود را در كيف تان قرار مي دهيد و به مدرسه مي بريد؟ اگر اينگونه باشد پس شما از نهان سازي استفاده مي كنيد . نهان سازي به معني قرار دادن چيزهاي مرتبط به هم در داخل يك شي جديد است .براي مثال يك حساب بانكي شامل : شمار ه حساب، نام مشتري، آدرس مشتري، نوع حساب و موجودي مشتري مي باشد . همچنين براي يك حساب بانكي رفتارهاي مانند باز كردن حساب، بستن حساب، برداشت از حساب و واريز به حساب وجود دارد . شما اين اطلاعات را باهم در داخل يك شي حساب پنهان مي كنيد . ائده اصلي كه نهان سازي ا رائه مي دهد اين است كه رفتار يك شي بايد تا حد ممكن دور از ديد كاربر باشد . به عبارت ديگر تا زماني كه لازم نباشد، كاربر نبايد متوجه شود كه يك شي چگونه درخواست هاي او را انجام مي دهد . استفاده از يك شي : تصور كنيد كه شما مي خواهيد به يك فرد رانندگي ياد بده يد براي اينكار شما يك سري از اطلاعات ضروري كه بايد آن فرد بداند را مشخص مي كنيد .به عنوان نمونه شما اطلاعاتي درباره ترمز ، دنده ، فرمان و آيينه را به او آموزش مي دهيد . اما آيا شما درباره نحوه كاركرد موتور ، نحوه عملكرد سيستم ترمز نيز مطالبي را به او ياد مي دهيد؟ نه، زيرا او نيازي ندارد كه براي رانندگي كردن بداند كه عملكرد داخلي ماشين چگونه است . ناميده مي (I nterface ) اطلاعاتي كه ماشين در معرض نمايش قرار مي دهد تا يك فرد بتواند از آن استفاده كند واسط ماشين شود . يك واسط راهي است تا شما با يك شي ارتباط برقرار كنيد براي آنكه شما مي خواهيد از رفتارهاي آن شي استفاده كنيد . براي مثال هنگاميكه شما پاي خود را روي پدال گاز ماشين قرار مي دهيد ، شما به او مي گوييد كه سريعتر حركت كند . يك واسط همچنين به شما اجازه مي دهد تا به اطلاعاتي از آن شي دسترسي پيدا كنيد . براي مثال واسط كيلو متر شمار مقدار مسيري كه به كيلومتر توسط آن ماشين طي شده است را نمايش مي دهد . آيا يك واسط به تنهايي كاري را انجام مي دهد؟ نه، يك واسط به تنهايي كاري را انجام نمي ده د. يك واسط بدون پياده سازي هيچ كاري را انجام نمي دهد . شما مي توانيد با يك شي ارتباط برقرار كنيد اما آن هيچ كاري انجام نمي (i mplementation )
  • 15. الگوهاي طراحي ۱۵ دهد . براي مثال شما يك كنترل از راه دور تلويزيون را در نظر بگيريد اگر مدار داخلي اين شي پياده سازي نشده باشد ما با فشار دادن هر كدام از كليد ها هيچ عكس العملي را مشاهده نخواهيم كرد . براي اينكه يك شي بتو اند وظايف خود را انجام دهد، شما نياز داريد كه مكانيزمهاي را فراهم كنيد كه به عملكردهاي واسط جواب بدهد . براي مثال هنگامي كه شما پدال گاز را فشار مي دهيد، رفتاري كه پشت واسط قرار دارد ولي كاربر آنرا مشاهده نمي كند باعث خواهد شد كه گاز بيشتري به موتور ارسال ش ود و ماشين شتاب بگيرد.
  • 16. الگوهاي طراحي ۱۶ نگرشي نو به شي گرايي داستان از اين قراره كه روزي يك نفر از دهي به شهر مياد و از قضاي روزگار به يك كنسرت موسيقي ميره . در بازگشت از شهر در راه به مطرب ده ميرسه كه داشته با پسرش ساز و دهل ميزده . همين كه مطرب رو مي بينه بهش ميگه كه من توي شهر رفتم يك جايي به اسم كنسرت و كلي از همكارات رو يك جا ديدم . مطرب هم كه تا به اون روز كنسرت نديده و نشنيده بوده، با بهت مي پرسه كه كنسرت چيه؟ مرد دهاتي ميگه كه كنسرت يه جايي كه اولش كه رفتيم تو يه عده روي يه بلندي با سازهاشون نشسته بود ند و هر كي براي خودش هي ساز ميزد (حواستون كه هست داشتند سازهاشون رو كوك مي كردن د). بعد يكي كه اصلا ساز نداشت از در اومد تو و همه براش دست زدند . بعد هم روشو كرد به مطربهاي روي بلندي و شروع كرد به دستور دادن كه تو بزن و تو نزن، تو بزن، تو نزن و الي آخر . آخرش م به همشون گفت ديگه نزنيد . بعد هم مردم براش دوباره دست زدند و اون هي دولا و راست ميشد مي گفت من .» نبودم اينا بودن من نبودم اينا بودن ميان (collaboration) اين دقيقا تعريف يك سيستم شي گراست . دقيقا هدف يك سيستم شي گرا ايجاد هارموني معنادار اجزاء مستقل سيستم ب راي دست يابي به يك كاركرد مشخص است . در صورتي كه در سيستمهاي ساخت يافته رويكرد ما دقيقا رويكرد حل مساله بود . مساله تعريف مي شد و برنامه نويس مساله را هدف گرفته و براي حل آن با استفاده از يك سري دستورات خطي شروع به حل مساله م يكرد . در منطق شي گرا اجزا يك سيست م الزاما تعلقي به سيستم ندارند و مي توانند به همان صورت كه به ساير سيستم ها سرويس مي دهند به سيستم مورد نظر ما نيز سرويسي را ارايه كنند . تنها مساله توان طراح سيستم در ايجاد تشريك مساعي و يا به تعبيري همكاري مناسب ميان اجزاء مختلف سيستم است توجه : اين نوشته متعلق به خود من نمي باشد . و من اين نوشته را از وبلاگ در گذار عمر با ذكر منبع پست كرده بودم . به خاطر نحوه نگرش جالب اين نوشته باز اين نوشته را اينجا قرار دادم و باز منبع را ذكر كردم تا رسم امانتداري را به جا آورده باشم.
  • 17. الگوهاي طراحي ۱۷ مقدمه اي بر الگو هاي طراحي كسي وجود دارد كه قبلاً مسله شما را حل كرده است . در مهندسي نرم افزار يك الگوي طراحي، يك روش حل قابل تكرار براي مسائلي هست كه عموماً در طراحي نرم افزار با آن برخورد مي كنيم . يك الگوي طراحي يك قالب يا شرح براي چگونگي حل مسائلي است كه مي تواند در شرايط مختلف استفاده شود . يك الگوي طراحي، راه حلي است كه براي مستند سازي ارزشمند تشخيص داده شده است، بطوريكه توسعه دهند گان ديگر مي توانند آن را در حل مسائل مشابه به كار ببرند .همانگونه كه طراحي شي گرا ادعا مي كند كه استفاد ه مجدد از كتابخانه ها و قطعات را افزايش مي دهد، ادعا مي شود كه استفاده از الگو هاي طراحي، استفده مجدد از كتابخانه ها و قطعات را افزايش مي دهد . الگو ها تكنيك هايي هستند كه افراد زماني از آنها براي حل مسائل خاص استفاده كردند . و به عنوان راه حل هاي خوب شناخ ته شده اند . سپس اين تكنيك ها مستند سازي شده اند تا توسعه دهندگان هنگام برخورد با مسائل مشابه از اين مستندات استفاده كنند و مسائل خود را حل كنند . تاريخچه الگو هاي طراحي : استفاده از الگوها براي اولين بار به ذهن يك معمار به نام الكساندر خطور كرد . الكساندر با اين مشكل روبرو شد كه يك طرح خوب و با كيفيت براي يك ساختمان چگونه مي تواند باشد . او براي حل مشكل خود، ساختمانها، خيابانها، شهرك ها و هر مكاني كه يك انسان براي خودش مي سازد را مورد مطالعه و بررسي قرار داد . او كشف كرد كه بناهاي خوب از نظر طراحي داراي ويژگيه اي مشترك هستند . او كشف كرد كه بناهاي خوب داراي ويژگيهاي مشابه هستند واين ويژگيهاي مشابه را الگو ناميد . هر الگو بيانگر يك مسئله و مشكل است كه مي تواند بارها و بارها روي بدهد همراه با راه حل آن مسئله، وشما مي تواند از اين راه حل براي ميليون ها بار استفاده ك ند بدون نياز مجدد براي پيدا كردن راه ح ل. ۱، بعضي از توسعه دهندگان نرم افزار با كارهاي الگساندر برخورد كردند . آنها با اين سوال روبرو شدند كه اگر در اوايل دهه ۹۹۰ الگو هاي طراحي معماري در اين رشته به صورت صحيح جواب مي دهد آيا مي توان الگوهاي را براي طراحي نرم افزار بوجود آورد . در نرم افزار چه مسائل وجو دارد كه بارها رخ مي دهد و تقريبا با روشهاي مشابه مي توان آنها را حل كرد؟ ·
  • 18. الگوهاي طراحي ۱۸ آيا امكان استفاده از مفهوم الگوها در طراحي نرم افزار وجود دارد، آيا مي توان راه حل هاي را برا اساس الگوها بعد از · شناسايي الگوها ايجاد كر د. س والات بالا، سوالاتي بودند كه توسعه دهندگان مطرح كردند و پاسخ آن را يافتند . پاسخ سوال بلي بود . مرحله بعدي شناسايي الگوها بود و توسعه استانداردهاي براي مستند سازي الگوها . در اوايل دهه ۱۹۹۰ ، افرادي زيادي روي الگوهاي طراجي كار مي كردند . اما چهار نفر به نام هاي ، گاما، جاكوبسون، هلم و ولسايدز بيشترين تاثير را در اين زمينه با نوشتن كتابي به نام داشتند . اين چهار نويسنده ، "Design Pattern: Elements of Reusable Object­Oriented Software" مشهور است . آنها در اين كتاب ائده استفاده از الگوها را در طراحي نرم افزار به كار بردند .و يك فرمت Gang of Four به استاندارد را براي مستندسازي الگوها ايجاد كردند . ۲۳ نوع از الگوها را دسته بندي كردند و .... به مرور زمان فرمت هاي استاندارد ديگري براي مستند سازي الگوها پيشهناد شد.
  • 19. الگوهاي طراحي ۱۹ قالب مستند سازي براي الگوهاي طراحي : نام الگو يك نام خوب و مفيد براي الگو يك جمله كوتاه و مختصر درباره چيزي كه الگو انجام مي دهد . (i ntent ) هدف (تعريف مسله و راه حل به صورت مختصر و مفيد ) نام مستعار نام هاي ديگري كه الگو با آن شناخته مي شود . ساختار يك نمايش گرافيكي از الگو اجزاء تشكيل دهنده (P articipants ) كلاس ها و اشيائ كه در الگو شركت دارند ( وجود دارن د). چگونه اجزاي تشكيل دهنده با هم همكاري مي كنند تا وظايفشان را (C ollaborations ) همكاريها انجام دهند . نتايج استفاده از الگوي مورد نظر (C onsequences ) نتايج پياده سازي تكنيك هاي براي پياده سازي الگوي مورد نظر نمونه كد تكه كدي براي پياده سازي يك نمونه الگو هاي مرتبط الگوهاي طراحي ديگري كه ارتباط نزديگ با الگوي مورد نظر دارند.
  • 20. الگوهاي طراحي ۲۰ دسته بندي الگو ها : همه الگو هاي كه در اين دسته قرار مي كيرند در ارتباط با روش :(C reational Pattern ) ۱ - الگوهاي بوجود آورنده هاي ايجاد اشياء هستند . اين نوع الگوها شرح مي دهند چگونه اشياء و كلاس ها مي توانند در :(S tructural Patten ) ۲ - الگوهاي ساختار ي ساختارهاي بزرگتر باهم تركيب شوند . اين نوع الگو ها روي ارتباط اش ياء با يكديگر تمركز دارن د. :(B ehavioral Pattern ) ۳ - الگوهاي رفتار ي Creational Structural Behavioral Factory Method Abstract Factory Builder Prototype Singleton Adapter Bridge Composite Decorator Flyweight Façade Proxy Interpreter Template Method Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor فهرست الگوهاي طراحي
  • 21. الگوهاي طراحي ۲۱ Singleton Pattern اشياء زيادي وجود دارند كه ما فقط و فقط به يك نمونه آن از اشياء نياز داريم . براي مثال سيستم شما فقط مي تواند فقط يك را داشته باشيد يا در اداره شما فقط مي تواند يك مدير عامل وجود داشته باشد و .... حال فرض كنيد كه COM نمونه از پورت 1 شما كلاسي داريد كه فقط بايد يك نمونه از آن ايجاد شود . شما اين مسئله را چگونه حل مي كنيد؟ الگوي است كه براي اينكار ايجاد شده است . يعني اطمينان از اينكه از كلاس ما فقط يك نمونه ايجاد ، Singleton Pattern شده است . اين الگو براي اين به كار مي رود تا ايجاد نمونه از يك كلاس را محدود كند . نحوه پيادسازي : آسانترين راه براي ايجاد كلاسي كه فقط مي تواند يك نمونه از آن ايجاد شود استفاده از يك متغيير استاتيك در داخل كلاس مي مي دهيم و در ساير دفعات اين متغيير True باشد . اولين نمونه اي كه از اين كلاس ايجاد مي شود ما متغيير استاتيك را مقدار باشد يك نمونه از شي ايجاد خواهد شد در غير اين صورت نمونه False استاتيك در سازنده تست مي شود اگر مقدارش جديدي از آن شي ايجاد نخواهد شد. VB.NET نمونه كد اول در تعريف كلاس Public Class Singleton Private Shared instance_flag As Boolean = False Private _Id As Integer Public Property Id() As Integer Get Return _Id End Get Set(ByVal value As Integer) _Id = value End Set End Property Public Shared Function GetInstance() As Singleton If (Not instance_flag) Then instance_flag = True Return New Singleton Else Return Nothing End If End Function End Class نحوه استفاده
  • 22. الگوهاي طراحي ۲۲ Dim Ins1, Ins2 As Singleton Ins1 = Singleton.GetInstance Ins2 = Singleton.GetInstance Ins1.Id = 200 Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id) Ins2.Id = 123 Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id) Console.ReadKey() خروج ي: هنگام استفاده از كلاس بالا به شيوه اي كه نوشته شد نمونه دوم از آن هيچ وقت ايجاد نخواهد شد پس تمام عملياتي كه نمونه دوم مي خواهد انجام دهد با خطا همراه خواهد بود . براي حل اين مشكل مي توانيم به صورت زير عمل كنيم . VB.NET نمونه کد دوم در تعريف كلاس Public Class Singleton Shared m_instance As Singleton Private _Id As String Public Property Id() As Integer Get Return _Id End Get Set(ByVal value As Integer) _Id = value End Set End Property Public Shared Function GetInstance() As Singleton If (m_instance Is Nothing) Then m_instance = New Singleton() End If Return (m_instance) End Function Private Sub New() End Sub End Class نحوه استفاده Dim Ins1, Ins2 As Singleton Ins1 = Singleton.GetInstance Ins2 = Singleton.GetInstance Ins1.Id = 200 Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id) Ins2.Id = 123 Console.WriteLine(Ins1.Id) Console.WriteLine(Ins2.Id) Console.ReadKey() خروجي:
  • 23. الگوهاي طراحي ۲۳ ۲۰۰ ۲۰۰ ۱۲۳ ۱۲۳
  • 24. الگوهاي طراحي ۲۴ Factory Patterns كارخان ه) ، دقيقا از معني لغوي آن مشخص است . كارخانه مكاني است كه در آن كالاها و محصولاتي توليد مي ) Factory مفهوم كلاسي است كه نمونه هاي از كلاس هاي ديگر را با توجه به پارامترهاي كه Factory شود . و در بحث الگوهاي طراحي، يك براي آن ارسال مي شود، ايجاد مي كند . براي ايجاد يك ذهنيت در خودتان مي توانيد تصور كنيد كه ما يك فروشگاه پوشاك داريم هر وقت كه فروشگاه به لباس خاصي ارسال مي كند و توليد كننده با توجه به اسامي ارسال شده آن لباس ها را (F actory ) نياز داشته باشيد . اسامي آن را به توليد كننده ما است كه با توجه به پارامترهاي Factory توليد كرده و به فروشگاه ارسال مي كند . در اين مثال توليد كننده همان كلاس ارسال شده ( ليست پوشاك مورد نظر فروشگا ه) لباس مورد نظر ( شي موزد نظ ر) را توليد مي كند و به مشتري ارسال مي كند. VB.NET نمونه كد اول در 'Class Shirt Public Class Shirt Protected _Color As String Protected _Size As String Public ReadOnly Property Color() Get Return _Color End Get End Property Public ReadOnly Property Size() Get Return _Size End Get End Property End Class 'Class Shrit_A Public Class Shrit_A Inherits Shirt Public Sub New() Me._Color = "Blue" Me._Size = "XL" End Sub End Class 'Class Shrit_B Public Class Shirt_B Inherits Shirt Public Sub New() Me._Color = "Red" Me._Size = "M"
  • 25. الگوهاي طراحي ۲۵ End Sub End Class 'Class Factory Public Class Factory Public Function GetShirt(ByVal Type As String) As Shirt If Type = "A" Then Return New Shrit_A() Else Return New Shirt_B() End If End Function End Class 'Class Store Public Class Store Private _OrderType As String Public Property OrderType() Get Return _OrderType End Get Set(ByVal value) _OrderType = value End Set End Property Public Function Order() As Shirt Dim Ins1 As New Factory Dim Ins2 As Shirt = Ins1.GetShirt(_OrderType) Return Ins2 End Function End Class نحوه استفاده Private Sub Cmd_Order_Click(ByVal sender As System.Object, ByVal eAs System .EventArgs) Dim Ins1 As New Store Dim INs2 As New Shirt Ins1.OrderType = "A" INs2 = Ins1.Order() End Sub
  • 26. الگوهاي طراحي ۲۶ دريچ ه) : ) Façade الگوي الگوي دريچه در سيستم هاي استفاده مي شود كه توسعه دهندگان مي خواهند پيچيدگي يك سيستم را در يك كلاس (در بعضي مواقع چند كلا س) مخفي كنند و با استفاده از اين كلاس و يا كلاس ها به عنوان واسط و ميانجي، پيچيدگي سيستم را كاهش دهند . اگر زير سيستمي حاوي چند كلاس باشد و اين كلاس ها با همديگر همكاري كنند تا سرويس هاي را كه قرار است زير سيستم ارائه دهد را تداراك ببينند، ريسكي در ايجاد واسط به آن زير سيستم وجود دارد . هر كلاس ممكن است چندين عمليات داشته باشد . زير سيستم هاي ديگر بايد توانايي ارسال پيام به نمونه هايي از هر كلاس را داشته باشند . به اين ترتيب، يك اتصال قوي بين زير سيستم ها به وجود مي آيد و اگر تغيير در كلاس هاي يك زير سيستم ارائه دهنده سرويس بوجود بيايد، نيازمند رديابي تمامي مكان ها در زير سيستم هاي هستيم كه عمليات اين كلاس ها را فراخواني كرده اند . مي باشد، كه واسطي را به زير سيستم ايجاد مي كند و اين كلاس به façade يك روش غلبه بر اين وضعيت، ايجاد كلاس عنوان نماينده زيرسيستم مورد نظر با زير سيستم هاي ديگر عمل مي كند . به اين ترتيب، تغيير در پياده سازي كلاس هاي زير سيستم اثر محدودي بر زير سيستم ها ي ديگر دارد . و اگر تغييري در كلاس ها صورت بگيرد، فقط لازم است نقاطي در زير سيستم ارسال شده اس ت. façade هاي ديگر پيدا شود كه در آنها، پيامي به نمونه هاي از كلاس حالا با بررسي چند مثال مي توانيم تصويري بهتري از اين الگو به دست بياوريم . تصور كنيد شما به عنوان مدير پروژه براي يك پروژه نسبتا بزرگ انتخاب شده ايد . در حالت اول شما خودتان وظيفه داريد مسئوليت تك و تك افراد پروژه را به آنها بگويد و وظايف واگذر شده به آنها را تحويل بگيريد . در اين حالت شما وظيفه داريد با تك و تك افراد ارتباط برقرار كنيد و همچنين براي با زخواست وظايف شما بايد نحوه ارتباط اين افراد را با يكديگر بدانيد . در حالت دوم يك نفر به عنوان سر گروه انتخاب مي شود و شما مسئوليت ها واگذر شده را به او اعلام مي كنيد و براي تحويل وظايف فقط از او بازخواست مي كنيد . حالا دو حالت را باهم مقايسه كنيد در كدام حا لت پيچيدگي و حجم كاري شما كم استفاده كرديم . سر گروه در اين حالت به عنوان façade است؟ البته كه حالت دوم . در حالت دوم در واقع ما از الگوي است. façade كلاس
  • 27. الگوهاي طراحي ۲۷ نحوه ارتباط مدير پروژه با اعضاء – Façade شك ل ۱ : الگوي براي مثال دوم در نظر بگيريد شما مسئول طراحي يك فروشگاه الكترونيكي هستيد كه در آن مشتري بايد قادر باشد براي پرداخت مبلغ خريد خود از كارت هاي اعتباري استفاده كند . شما به يكي از شركت هاي صادر كننده كارت اعتباري مراجعه مي كنيد و مي خواهيد نحوه استفاده و موارد مورد نياز براي اينكار را به شما ارائه دهد . شركت مورد نظر هيچ وقت ساختار و كلاس هاي مورد نظر را كه در داخل برنامه خود براي اينكارها استفاده مي كنند دقيقا به شما ارائه نمي دهد . چون اين نه به نفع شركت مورد نظر است نه به نفع شما، چون با اين كار پيچيدگي سيستم پرداخت دقيقا به برنامه شما نيز اضافه خواهد شد . پس چاره كار را به عنوان ميانجي بين برنامه شما و برنامه سيستم façade شركت مورد نظر يك كلاس . façade چيست؟ استفاده از كلاس پرداخت خودشان طراحي و در اختيار مشتريان خود قرار مي دهند و شما پيام هاي خود را به اين كلاس ارسال مي كند و آن نيز براي گرفتن و ارسال پاسخ به شما، پيام مورد نظر را به كلاس اصلي ارسال مي كند و پاسخ را از آن دريافت و به شما ارسال مي كند . براي مثال آخر فرض كنيد شما وظيفه داريد يك برنامه براي ايجاد و ارسال ايميل بنويسيد كلاس هاي كه ممكن است براي اينكار در نظر بگيريد مي تواند به صورت شكل زير باشد . اين كلاس شامل بدنه پيام خواهد بود . : MessageBody كلاس · در صورت نياز شامل MessageBody اين كلاس نمونه سازي مي شود تا يك كلاس : Attachment كلاس · فايل پيوست باشد . اين كلاس نمونه سازي مي شود تا شامل اطلاعات سرآيند فايل باشد : MessageHeader كلاس · .From,To,Subject,… مانند
  • 28. الگوهاي طراحي ۲۸ را به MessageHeader و MessageBody اين كلاس نمونه سازي مي شود تا دو كلاس : Message كلاس · هم متصل كند ( پيوند بزن د). اين كلاس نمونه سازي مي شود تا در صورت نياز پيام ارسالي رمز گذاري شو د. :S ecurity كلاس · اين كلاس نم ونه سازي مي شود تا در آخر پيام مورد نظر را به سرور مربوطه ارسال كند . : MessageSender كلاس · شكل زير نمودار كلاس هاي بالا را همراه با ارتباطات آنها نشان مي دهد . نمودار كلاس ايجاد و ارسال ايميل ،F açade شك ل ۲ :الگوي را مي تواند client با مشاهده تصوير بالا مي تواند حدس بزند كه كار با كلاس هاي كه براي اينكار در نظر گرفته ايد، كلاس بيش از حد پيچيده كند . براي استفاده از اين كلاس ها، كلاس كلاينت بايد با اين ۶ كلاس و همچنين بايد با روابط بين آنها آشنا استفاده كنيم يعني براي كاهش پيچيدگي از يك كلاس جديد façade باشد . دوباره براي كاهش پيچيدگي مي توانيم از الگوي ا س تفاده مي كنيم . طرح جديد مي تواند به شكل زير باش د. نمودار كلاس ايجاد و ارسال ايميل اصلاح شده ،Façade شک ل ۳: الگوي
  • 29. الگوهاي طراحي ۲۹ نمودار كلاس الگوي دريچه : نمودار كلاس الگو به صورت زير مي باش د. Façade شك ل ۴ : نمودار كلاس الگوي اجزاء تشكيل دهنده الگو : كلاس ها و اشياء تشكيل دهنده اين الگو عبارتند از : : façade كلاس · اين كلاس مي داند كه كلاس هاي زير سيستم بايد به پيام دريافت شده پاسخ دهند . o پيام هاي دريافت شده را به شي مناسب براي پاسخگوئي ارسال مي كند . o كلاس هاي زير سيستم : · آگاه نيستند . façade كلاس هاي زير سيستم از وجود كلاس o پاسخ مي دهند . façade به پيام هاي ارسال شده توسط كلاس o به كار برده بودم . ولي آقاي façade توجه : من در پست اصلي كه در وبلاگ موجود است، عنوان نما را به عنوان گزينه فارسي مهندس مهرداد توصبه كردند كه به جاي نما از معادل دريچه استفاده كنيم كه به كاربرد آن نيز نزديگتر باشد . Adapter Pattern الگوي است كه در دنيا واقعي نمونه هاي زيادي از اين الگو ، (A dapter Pattern ، الگوي سازگارساز (وفق دهنده، مبدل وجود دارد و به همين خاطر درك اين الگو زياد مشكل نخواهد بود.
  • 30. الگوهاي طراحي ۳۰ شما داراي دو شاخه اي به شكل زير است ولي پريز هاي برقي laptop شكل زير را در نظر بگيريد و فرض كنيد كه كامپيوتر كه در ديوار نصب شده است به شكلي است كه در سمت چپ تصوير نشان داده شده است . شما براي استفاده از لپ تاپ خود در اين محل چه كاري را انجام مي دهيد؟ شما مي توانيد براي حل اين مشكل از يك مبدل استفاده كنيد . كه بين دو شاخه، لپ تاپ شما و پريز برق قرار مي گيرد و شما مي توانيد با قرار دادن دو شاخه در مبدل و زدن مبدل به پريز از برق استفاده كنيد . در واقع مبدل، اينترفيس پريز را به گونه اي تغيير مي دهد كه با اينترفيسي كه لپ تاپ شما نياز دارد همخواني داشته باشد . مثال بالا يك مثال از دنيا واقعي بود . ولي يك وفق دهنده شي گرا چست؟ وفق دهنده هاي شي گرا دقيقا كار مشابهي را انجام مي دهند . آنها يك اينترفيس را به گونه اي تغيير مي دهند كه سرويس گيرنده ها انتظار آنرا دارند . وفق دهند هاي شي گرا : فرض كنيد كه شما يك سيستم نرم افزاري داريد كه نياز دارد با كتابخانه ي از كلاس هاي جديد كه مربوط به فروشندگان است كار كند، اما كلاس هاي جديد به گونه اي طراحي شده اند كه اينترفيس متفاوتي را نسبت به اينترفيس قبلي دارند . براي حل اين مشكل شما چيكار مي كنيد؟ مي توانيد سيستم نرم افزاري موجود را به گونه اي باز نويسي كنيد كه با كلاس هاس جديد همخواني داشته باشد . يا كلاس هاي جديد را به گونه اي تغيير مي دهيد كه با سيستم موجود همخواني داشته باشد . اما آيا راه حل كم هزينه تري وجود ندارد كه بدون تغيير هيچ كدام از سيستم ها، سيستم كار خود را انجام دهد . شما مي توانيد يك كلا س بنويسيد كه اينترفيس فروشندگان را به گونه اي تغيير بدهد كه سيستم موجود انتظار دارد.
  • 31. الگوهاي طراحي ۳۱ سازگار ساز، وفق دهند ه) مانند يك واسطه عمل مي كند و درخواست هاي را كه از سيستم موجود مي رسد دريافت )A dapter مي كند و آنها را به شكلي تغيير مي دهد و براي كلاس مورد نظر در سيستم فروشندگان ارسال مي كند كه قابل درك و اجرا براي آن كلاس باشد . تعريف شده است را نياز دارد . ولي Math را كه در اينترفيس 1 Max براي نمونه در شكل بالا كلاس كلاينت متدي به نام كلاس هاي كه اين اينترفيس را پياده سازي مي كنند . عملي را كه كلاس كلاينت در نظر دارد انجام نمي دهند . ولي پياده سازي شده است و دقيقا خواسته Imp است كه توسط كلاس 2 Maxvalue داراي عملي به نام Math اينترفيس 2 كلاس كلاينت را انجام مي دهد ولي با يك اينترفيس ديگر . براي حل اين مشكل چه پيشنهادي داريد؟ استفاده مي كنيم . يعني يك كلاس جديد تعريف مي كنيم كه اينترفيسي را ، (A dapter ) براي حل اين مشكل ما از يك مبدل را طوري سر بار گذاري مي كنيم كه وقتي آن فراخواني مي Max كه كلاس كلاينت مي شناسد پياده سازي مي كند . ولي عمل را فراخواني كند . Imp از كلاس 2 Maxvalue شود . عمل : Adapter نمودار كلاس نمودار كلاس الگو به صورت زير است:
  • 33. الگوهاي طراحي ۳۳ State Pattern حال شما چطور است؟، سوالي است كه در يك روز بارها از شما پرسيده مي شود يا شما از ديگران مي پرسيد . حال شما يك ويژگي ثابت شما نيست بلكه يك ويژگي پويا است كه ممكن است با توجه به رويدادهاي خارجي يا دروني تغيير كن د. و شما مي توانيد در مقابل يك رويداد مشابه با توجه به حالتان رفتار متفاوتي از خود نشان دهيد . علاوه بر خودمان اكثر اشياي كه در اطراف ما قرار دارند داراي حالت هاي متفاوتي هستند و با توجه به رويداد هاي بيروني و داخلي از حالت به حالت ديكر مي رو ند و رفتار متفاوتي را در هر حالت از خود بروز مي دهند . در حال ديدن يك فيلم هستيد . اين برنامه دكمه هاي ،W indows Media Player براي مثال فرضي كنيد با يك برنامه مانند دارد كه با كليك روي آنها مي توانيد برنامه را به حالت همنام با آن دكمه ببري د. پس براي اين Stop و Pause ،P lay مانند شي، سه حالت بالا را مي توانيد در نظر بگيري د. حال تصوير كنيد كه يك برنامه شبيه به مثال بالا را خودمان مي خواهيم بنويسيم . ،M edia Player يكي از شيوه ها براي انجام اين كار مي تواند به اين ترتيب باشد كه ما در ابتدا تمام حالاتي را كه يك شي مي تواند قبول كند را جمع آوري مي كنيم . در مرحله دوم براي هر حالت يك متغيير تعريف مي كنيم و مقادير مربوط به آنها را مشخص مي كنيم و علاوه بر اينها يك متغيير براي نگهداري حالت فعلي شي در نظر مي گيري م. const int play=0; const int stop=1; const int pause=2; int state = stop; // حالت اوليه سپس تمام اعمالي و رويدادهاي كه در سيستم مي تواند رخ دهد را جمع آور مي كنيم . و در انتها يك كلاس ايجاد مي كنيم كه به عنوان يك ماشين حالت عمل كند، براي هر عمل يك متد ايجاد مي كنيم كه جملات شرطي را به كار مي برند تا رفتار مناسبي را كه در هر حالت نياز است را پياده سازي كنند . public void Stop() { if (state == play) { عمليات مورد نظر// } if (state == pause) { عمليات مورد نظر// } if (state == stop) { عمليات مورد نظر// } } روش بالا مي تواند براي پياده سازي يك شي كه داراي چندين حالت است به كار برود . ولي تصور كند كه يك حالت جديد را بخواهيم به شي اضافه كنيم و يا در نحوه عملكرد شي در يك حالت خاص تغيير دهيم مطمئنا كار مشكلي را خواهيم داشت . يك روش خوب و كارا براي پياده سازي اشياي كه در طول حيات خود مي توانند چندين حالت مختلف داشته باشند، مي تواند چگونه باشد؟ شايد شما پاسخ هاي خوب و بهتري بتوانيد ارائه كنيد . ولي يكي از روش ها مي تواند به صورت زير باشد:
  • 34. الگوهاي طراحي ۳۴ تعريف مي كنيم كه شامل يك متد براي هر عملي است كه شي مورد نظر مي تواند state ۱. در ابتدا يك اينترفيس به نام ا نجام دهد . را پياده سازي مي كند . در واقع اين state ۲. در مرحله دوم براي هر حالت شي يك كلاس تعريف مي كنيم كه اينترفيس كلاس مسول پاسخگويي به رويدادها است . زمانيكه شي در اين حالت قرار دارد . تعريف مي كنيم . سپس براي هر state در ابتدا ما يك كلاس اينترفيس به نام ،M edia Player براي نمونه در همان مثال را پياده سازي مي كند . براي پياده سازي هر حالت ما نياز داريم تا رفتار state حالت يك كلاس تعريف مي كنيم كه اينترفيس هر كلاس را مشخص كنيم هنكاميكه هر عمل فرا خواني مي شود . مي رسيم . اين ( M edia Player ) بعد از پياده سازي تمام حالات شي مورد نظر، به كلاس اصلي يا همان كلاس شي مورد نظر كلاس همان متد هاي روش اول را خواهد داشت اما با چندين تفاوت : ۱. به جاي استفاده از متغييرهاي عددي براي هر حالت و حالت فعلي، از اشياء كه براي حالت ها تعريف كرديم استفاده مي كنيم . كد جديد كد قديمي public class MediaPlayer{ State MediaState; PlayState playstate; PauseState pausestate; StopState stopstate; MediaPlayer{ playstate = new PlayState(); new PauseState (); = pausestate stopstate = new StopState(); MediaState = stopstate; } Public class MediaPlayer{ const int play=0; const int stop=1; const int pause=2; MediaPlayer{ const int state = stop; // حالت اوليه }
  • 35. الگوهاي طراحي ۳۵ ۲. در پياده سازي عمل ها ديگر از جملات شرطي استفاده نمي كنيم . بلكه وقتي عملي فراخواني مي شود آن عمل به كلاس حالت فعلي براي انجام واگذار مي شود . public void Stop() { MediaState.stop(); } حالت فعلي اجاره خواهد شد بدون هيچ جمله ي شرط ي. stop اشاره گر به حالت فعلي اس ت. متد MediaState چون :( State Pattern) نمودار الگوي حالت ما تا اينجا يك الگوي حالت را بطور كامل پياده سازي كرديم . ولي دوباره نكات بالا را باهم بررسي مي كنيم . ۱. رفتار يك شي توسط حالت داخلي آن شي مشخصي مي شود كه در مقابل رخ دادن يك رويداد مي تواند تغيير كند . ۲. تعداد حالات يك شي را بايد بتوانيم افزايش بدهيم بدون اينكه مجبور باشيم قسمت هاي زيادي از كد را مرور كنيم يا تغيير دهيم . الگوي حالت، به يكي شي اجازه مي دهد رفتارش را زمانيكه حالت داخلي شي تغيير كند، تغيير دهد . و همچنين با در نظر گرفتن هر حالت به عنوان يك شي جداگانه، حالات شي را نهان سازي مي كند . و ما مي توانيم هر تعداد حالات مورد نظر را به شي تغيير انجام دهيم . context مربوطه اضافه كنيم بدون اينكه در پياده سازي كلاس .M edia Player كلاسي است كه مي تواند داراي چندين حالت داخلي باشد در مثال ما همان Context كلاس يك اينترفيس مشترك براي همه حالت ها تعريف مي كند . State اينترفيس PlayState, عمل هاي را كه شي در آن حالت انجام مي دهد، پياده سازي مي كنند .( كلاسهاي ، Concrete كلاس هاي (StopState,PauseState
  • 36. الگوهاي طراحي ۳۶ (Chain of Responsibility pattern) الگوي زنجيره مسئوليت يك سرويس دهنده اينترنتي را در نظر بگيريد . اين شركت داراي سه سطح پشتيباني به شرح زير براي كاربران اس ت: سطح ۱ : در اين سطح به مشكلات ابتدايي كاربران مانند فراموش كردن كلمه عبور كاربران و ... رسيدگي مي شود . سطح ۲ : اگر اعضاي گروه سطح ۱ نتوانند مشكل مورد نظر را حل كنند . مشكل براي حل به گروه سطح ۲ ارجاع داده مي شود . سطح ۳ : اگر اعضاي گروه ۲ نيز نتوانند مشكل مورد نظر را حل كنند . مشكل براي حل به گروه سطح ۳ ارجاع داده مي شود . در اين سطح براي حل مشكل يك قرار ملاقات در محل مشكل با مشتري گذاشته مي شود . همانطوريكه در مثال بالا مشخص است . ممكن است هر كدام از گروه ها به در خواست ارائه شده پاسخ دهند . ولي دقيقا مشخص نيست كدام گروه به در خواست ارائه شده پاسخ خواهد داد . اما همه گروه ها بايد شانس اين را داشته باشند كه به درخواست ارائه شده پاسخ دهند . اين شانس اولويت دار است . براي نمونه در مثال بالا ابتدا به تيم سطح ۱ اين شانس داده مي شود تا مشكل را حل كند . در صور ت عدم حل مشكل به ترتيب، شانس به تيمهاي ۲ و ۳ داده مي شود . اين امكان نيز وجود دارد كه هيچ يك از تيم ها نتوانند اين مشكل را حل كنند و درخواست ارائه شده بدون پاسخ بماند . زنجيره مسئولي ت) مي باشد . ) Chain of responsibility مثالي كه در بالا ارائه شده تقريبا تعريفي از الگوي در اين الگو به يك شي اجازه داده مي شود در خواستي را ارسال كند بدون اينكه بداند كدام شي يا اشياء آنرا دريافت خواهند كرد و به آن پاسخ خواهند داد . اين كار با ارسال درخواست به زنجيره اي از اشياء صورت مي گير د. هر شي در اين زنجيره مي تواند به درخواست ارائه شده پاسخ دهد يا آن را به شي بعدي در زنجيره ارسال كند . در واقع هر شي در زنجيره بعنوان يك پاسخگو براي درخواست ارائه شده عمل مي كند . اگر شي مورد نظر بتواند درخواست راجواب دهد، پاسخ آن را مي دهددر غير اينصورت آن را به شي جانشين اش ( شي بعدي در زن جير ه) ارسال مي كند . براي ادامه موضوع يك مثال ديگر را در نظر مي گيريم . فرض كنيد شما مسول نوشتن يك برنامه براي شبيه سازي فرآيند تائيد يك درخواست سفارش از يك شركت هستيد . در اين شركت، بعد از اينكه درخواستي توسط مشتري ارائه مي شود بايد در ابتدا توسط مدير تائيد شود و در صورت تائيد توسط مدير، جنس به مشتري فروخته خواهد شد . اين شركت داراي چهار سطح مديريت مي باشد و مشخص شده است كه هر مدير سفارشاتي با مبلغ چقدر را مي تواند تائيد كند . كه حد مبالغي كه مي توانند تائيد كنند در جدول زير مشخص شده اس ت. سطوح مديريت مبلغ سفارش مدير نمايندگي ۲۵۰۰۰ مدير ناحيه ۱۰۰۰۰۰ نايب رئيس ۲۰۰۰۰۰ رئيس ۴۰۰۰۰۰
  • 37. الگوهاي طراحي ۳۷ شما براي اينكار چه الگوي را پيشنهاد مي كنيد؟ اجاز ه بدهيد كار را با الگوي زنجيره مسولئيت ادامه دهيم . در ابتدا يك كلاس براي سفارش به نام سفارش خريد در نظر مي گيري م. سپس يك كلاس انتزاعي به نام مديريت سفارش تعريف مي كنيم كه داراي يك اينترفيس مشترك براي هر كدام از سطوح مديريت اس ت. كه نمودار كلاس مربوط به مديريت سفارش و سطوح مديريت به صورت زير خواهد بود . كه متد تعيين شي براي مشخص كردن شي بعدي ( شي جانشي ن) در زن جيره عمل مي كن د. ، (S etSuccessor ) جانشين براي تائيد يك سفارش، كارهاي زير صورت خواهد گرفت : ۱. ايجاد يك مجموعه از اشياي كه مي توانند به درخواست هاي رسيده شده پاسخ بدهند ( سطوح مديري ت). و قرار دادن آنها در يك زنجيره به طور مرتب بر حسب مقاديري كه مي توانند تائيد كنند . هر يك از اين اشياء توسط (M ain به شي بعدي متصل مي شود . (كلاس SetSuccessor متد ۲. يك درخواست تائيد به اولين شي موجود در زنجيره ارسال مي شود كه اين كار توسط فراخواني آن شي انجام مي شود . اگر مبلغ سفارش از مقدار مبلغي كه ان شي ني تواند تائيد كند كوچكتر authorize متد باشد، آنرا تائيد مي كند در غير اينصورت آن درخواست را به شي بعدي در زنجيره ارسال مي كند . (براي مثال در كد را بررسي كنيد . ) BranchManager زير مي توانيد كلاس
  • 38. الگوهاي طراحي ۳۸ كلاس مديريت سفارش abstract class RHandler { protected RHandler successor; public void SetSuccessor(RHandler successor) { جانشين شی تعيين// this.successor = successor; } public abstract void authorize (PurchaseRequest purchase); } كلاس مدير نمايندگي class BranchManager: RHandler { public override void authorize (PurchaseRequest purchase) { تائيد سفارش// if (purchase.Amount <=25000) { } else if (successor != null) { successor.ProcessRequest(RegionalDirector); } } } Main كلاس class MainApp { static void Main() { BranchManager A = new BranchManager(); RegionalDirector B = new RegionalDirector(); VicePresident C = new VicePresident(); President D = new President(); A.SetSuccessor(B); B.SetSuccessor(C); C.SetSuccessor(D); Purchase p = new Purchase( 1, "Order 1",15000); A.authorize(p); Purchase p = new Purchase( 2, "Order 2",110000); A.authorize(p); } }
  • 39. الگوهاي طراحي ۳۹ دياگرام كلاس الگو:
  • 40. الگوهاي طراحي ۴۰ Template method بعضي ار مردم نمي توانند زندگي را بدون قهوه تصور كنند و بعضي ديگر زندگي را بدون چاي نمي توانند تصور كنند . ولي جزء تشكيل دهنده اصلي هر دو كافئين است . شباهت هاي ديگر نيز بين اين دو مورد وجود دارد . روش ساخت هر دوي آنها تقريبا مشابه است . شما اغلب موارد به ترتيب زير عمل مي كنيد . دستوالعمل ساخت قهوه : ۱. مقداري آب را مي جوشانيد . ۲. مقدار قهوه در آب جوشانده شده مي ريزد تا دم بكشد . ۳. فهوه را در فنجان مي ريز د. ۴. مقداري شكر و يا شير به آن اضافه مي كنيد . دستورالعمل ساخت چا ي: ۱. مقداري آب را مي جوشانيد . ۲. مقدار چاي خشك در آب جوشانده شده مي ريزد تا دم بكشد . ۳. چاي را در فنجان مي ريز د. ۴. مقداري شكر به آن اضافه مي كنيد . اگر بخواهيم برنامه اي براي تهيه چاي و قهوه بنويسيم كلاس هاي را به صورت زير خواهيم داشت . كلاس قهوه Public Class Coffee ' هر مرحله از دستورالعمل ساخت قهوه به عنوان يک متد در نظر گرفتهشده اس ت. Public Sub prepareRecipe() ' مراحل تهيه قهوه boilWater() brewCoffeeGrinds() pourInCup() addSugereAndMilk() End Sub Public Sub boilWater() Console.WriteLine(" ("جوشاندن آب End Sub Public Sub brewCoffeeGrinds() Console.WriteLine(" ("ريختن پودر قهوه به داخل آب جوشانده شده End Sub Public Sub pourInCup() Console.WriteLine(" ("ريختن قهوه به فنجان End Sub Public Sub addSugereAndMilk() Console.WriteLine(" ("اضافه کردن شير و شکر End Sub End Class
  • 41. الگوهاي طراحي ۴۱ كلاس چاي Public Class Tea Public Sub prepareRecipe() boilWater() brewTea() pourInCup() addSugere() End Sub Public Sub boilWater() Console.WriteLine(" ("آب جوشاندن End Sub Public Sub brewTea() Console.WriteLine(" ("ريختن چای به داخل آب جوشانده شده End Sub Public Sub pourInCup() Console.WriteLine(" ("ريختن چای به فنجان End Sub Public Sub addSugere() Console.WriteLine(" ("اضافه کردن شکر End Sub End Class دقيقا مشابه يكديگر هستند . پس pourInCup و boilWater با مشاهده دو كلاس بالا مشاهده مي شود كه دو متد طراحي ما داراي اشتباه هست چون بعضي از كدها تكرار شده اند . پس ما بايد طراحي خود را تغيير دهيم . ما مي توانيم طراحي خود را به صورت زير تغيير دهيم . دو متد كاملا مشابه در كلاس پايه پياده سازي مي شود . اما چون در هر كلاس به صورت نتفاوت عمل مي كند . اين متد در زير كلاس هاي مربوطه پياده سازي مي prepareRecipe متد شود . طراحي بالا يك طراحي خوب است اما نمي شود طراحي را بهتر از اين كرد؟ اگر توجه كنيم متوجه مي شويم كه براي تهيه هر دو مورد الگوريتم يكساني را به كار مي بري م: ۱. جوشاندن آبي ۲. اضافه كردن چاي يا قهوه به آب جوشيده شده ۳. ريختن نوشيدني به دست امده در فنجان
  • 42. الگوهاي طراحي ۴۲ ۴. اضافه كردن چاشني مورد نظر به نوشيدني را در كلاس پايه پياده سازي كني م. prepareRecipe پس ما مي توانيم با كمي تغييرات متد Public Sub prepareRecipe() boilWater() brewTea() pourInCup() addSugere() End Sub Public Sub prepareRecipe() boilWater() brewCoffeeGrinds() pourInCup() addSugereAndMilk() End Sub همانطوريكه مي توانيد مشاهده كنيد كلاس مر بوط به قهوه متدهاي به را استفاده مي كند در حاليكه كلاس مربوط به چاي از addSugereAndMilk و brewCoffeeGrinds نام استفاده مي كند . يك راه حل اين است كه براي هر مرحله غير مشابه يك نام addSugere و brewTea متد هاي به نام تغيير دهيم . و نام brew را به brewCoffeeGrinds و brewTea مشترك در نظر بگيريم . نام متدهاي تغيير مي دهيم . پس addCondiments را به addSugere و addSugereAndMilk متدهاي براي هر دو كلاس به صورت زير تغيير مي كند . prepareRecipe متد Public Sub prepareRecipe() boilWater() brew () pourInCup() addCondiments() End Sub پس حالا مي توانيم اين متد را بطور كامل به كلاس پايه منتقل كنيم و طراحي را به صورت زير تغيير دهيم . Template حالا ما براي اين مسله به يك طراحي ائده ال دست يافتيم . كاري كه ما براي حل اين مسله انجام داديم به نام الگوي از كلاس پايه درك prepareRecipe شناخته مي شود . دليل نامگذاري اين الگو را مي توانيم با مشاهده متد method
  • 43. الگوهاي طراحي ۴۳ يك متد است و دوما به عنوان يك قالب براي الگوريتم به كار مي رود . براي نمونه در prepareRecipe كنيم . اولين اينكه اين مثال شامل الگوريتم تهيه يك نوشيدني مي باشد . مراحل انجام يك الگوريتم را در يك متد در كلاس پايه تعريف مي كند و اجازه مي دهد زير ، Template method الگوي كلاس ها يك يا چند مرحله از الگوريتم را پياده سازي كنند . در واقع اسكلت يك الگوريتم در يك متد تعريف مي شو د. هدف ما در اين الگو، ايجاد يك قالب براي يك الگوريتم است . يك قالب يك الگوريتم را به صورت مجموعه اي از مراحل تعريف مي كند . هر كد ام از اين مراحل به عنوان يك متد در نظر گرفته مي شود . كه بعضي از متدها در همان كلاس پايه پياده در كلاس پايه در نظر گرفته مي شود و در زير كلاس ها پياده سازي مي abstract سازي مي شود و بعضي از متدها به صورت شود . : UML نمودار است . كه الگوي Abstract يك كلاس AbstractClass اين الگو به صورت بالا است . كه در آن كلاس UML نمودار است ( يك مرحله از الگوريت م) كه در Abstract يك متد primitiveOperation قالب در آن تعريف مي شود . و متد زير كلاس پياده سازي خواهد شد . همانطوريكه در مثال بالا مشاهده كرديم مي تواند بيش از يك وجود داشته باشد . اين حالت زماني رخ مي دهد كه بعضي از مراحل الگوريتم بتواند در روش هاي ConcerteClass كلاس مختلف پياده سازي شود.
  • 44. الگوهاي طراحي ۴۴ (Strategy Pattern) الگوي استراتژي در زندگي روزمره خود به مسائلي برخورد مي كنيم و براي غلبه بر اين مسائل ممكن است چندين راه حل پيش رو داشته باشيم . ما با توجه به شرايط خود يا به اجبار يكي از اين راه حل ها را انتخاب مي كنيم . در طراحي و پياده سازي يك نرم افزار نيز اين شرايط وجود دارد يعني جهت انجام يك عمل خاص مي توانيم از چندين الگوريتم خاص استفاده كنيم در اين حالت مي توانيم برنامه را طو ري طراحي كنيم كه خود برنامه به صورت پويا الگوريتم با بازدهي بالاتر را اتنخاب كند يا اين امكان را به برنامه كلاينت يا كاربر بدهيم تا يكي از الگوريتم ها را جهت انجام آن عمل انتخاب كند . براي مثال فرض كنيد كه ما در حال طراحي يك برنامه مسيريابي براي يك شبكه ه ستيم . همانطوريكه مي دانيم براي مسير يابي الگوريتم هاي مختلفي وجود دارد كه هر كدام داراي مزايا و معايبي هستند . و با توجه به وضعيت موجود شبكه يا عملي كه قرار است انجام پذيرد بايد الگوريتمي را كه داراي بالاترين كارائي است انتخاب كنيم . همچنين اين برنامه بايد ام كاني را به كاربر بدهد كه كارائي الگوريتم هاي مختلف را در يك شبكه فرضي بررسي كنيد . حالا طراحي پيشنهادي شما براي اين مسله چست؟ دوباره فرض كنيد كه در مثال بالا در بعضي از الگوريتم ها نياز داريم كه گره هاي شبكه را بر اساس فاصله ي آنها از گره مبداء مرتب كنيم . د وباره براي مرتب سازي الگوريتم هاي مختلف وجود دارد و هر كدام در شرايط خاص، كارائي بهتري نسبت به الگوريتم هاي ديگر دارد . مسئله دقيقا شبيه مسئله بالا است و اين مسله مي توانند داراي طراحي شبيه مسله بالا باش د. پس اگر ما بتوانيم يك طراحي خوب براي اين مسئله ارائه دهيم مي توانيم اين طراحي را براي مسائل مشابه به كار ببريم . هر كدام از ما مي توانيم نسبت به درك خود از مسئله و سليقه كاري، طراح هاي مختلفي براي اين مسئله ارائه دهيم . اما يك طراحي كه مي تواند يك جواب خوب و عالي باشد، الگوي استراتژي است كه توانسته است بارها و بارها به اين مسئله پاسخ بدهد . الگوي استراتژي گزينه مناسبي براي مسائلي است كه مي توانند از چندين الگوريتم مختلف به مقصود خود برسند . اين الگو بصورت زير اس ت: UML نمودار اجازه بدهيد، شيوه كار اين الگو را با مثال مربوط به مرتب سازي بررسي كنيم . فرض كنيد كه ما تصميم گرفتيم كه از سه الگويتم زير براي مرتب سازي استفاده كنيم.
  • 45. الگوهاي طراحي ۴۵ Shell Sort ۱ Quick Sort ۲ Merge Sort ۳ ما براي مرتب سازي در اين برنامه داراي سه استراتژي هستيم . كه هر كدام را به عنوان يك كلاس جداگانه در نظر مي گيريم بتواند به سادگي يك از استراتژي ها را انتخاب كنيد Client براي اينكه كلاس .(C oncreteStrategy (همان كلاس هاي تعريف abstract بهتر است كه تمام كلاس هاي استراتزي داراي اينترفيس مشترك باشند . براي اين كار مي توانيم يك كلاس كنيم و ويژگيهاي مشترك كلاس هاي استراتژي را در آن قرار دهيم و كلاس هاي استر اتژي آنها را به ارث ببرند (همان و پياده سازي كنند . (S trategy كلاس كه كلاس هاي استراتژي آنرا به ارث مي برن د. abstract كلاس abstract class SortStrategy { public abstract void Sort(ArrayList list); } QuickSort کلاس مربوط به class QuickSort : SortStrategy { public override void Sort(ArrayList list) { الگوريتم مربوطه // } } ShellSort کلاس مربوط به class ShellSort : SortStrategy { public override void Sort(ArrayList list) { الگوريتم مربوطه // } } MergeSort کلاس مربوط به class MergeSort : SortStrategy { public override void Sort(ArrayList list) { الگوريتم مربوطه // } } كه يكي از استراتزيها را براي مرتب كردن ليست به كار مي بر د. Context كلاس class SortedList { private ArrayList list = new ArrayList(); private SortStrategy sortstrategy; public void SetSortStrategy(SortStrategy sortstrategy) { this.sortstrategy = sortstrategy;
  • 46. الگوهاي طراحي ۴۶ } public void Add(string name) { list.Add(name); } public void Sort() { sortstrategy.Sort(list); } }
  • 47. الگوهاي طراحي ۴۷ Observer Pattern شايد شما هم زمانيكه تلويزيون را باز مي كنيد، يا وارد اينترنت مي شود، يكراست به سراغ شبكه ها يا سايت هاي خبري مي رود، تا از اتفاقات و رويدادهاي مورد علاقه خود آگاه شود . حتي بعضي وقت ها اين خبرها و رويدادها باعث مي شوند شما روند كاري خود را تغيير ده يد . حتي بعضي از خبرها در موضوعات خاص براي شما آنقدر اهميت دارد كه، عضو يك سايت خبري مي شود تا هر زمانيكه خبر جديدي وجود داشته باشد، به ايميل شما نيز ارسال شود . بنابراين هر زمانيكه يك خبر جديد به سايت اضافه مي شود، آن خبر به ايميل شما نيز ارسال مي شود . تا زمانيكه شما از عضويت در آن سايت انصراف نداديد، همه خبرهاي جديد به شما ارسال مي شود، و زمانيكه شما از عضويت خود انصراف داديد، خبرهاي جديد به شما ارسال نخواهد شد ولي براي اعضاء ديگر سايت ارسال خواهد شد . اگر شما مسئول طراحي اين سيستم بوديد، چگونه عمل مي كرديد؟ يك مركز كاريابي را در نظر بگيريد، افراد مختلفي با تخصص هاي مختلف، به اين مركز مراجعه مي كنند، و با توجه به تخصص هايشان براي درخواست كار ثبت نام مي كنند . هر زمانيكه درخواست نيرو توسط يك شركت در يك تخصص خاص از آن مركز شد . آن مركز افرادي را كه در آن تخصص ث بت نام كرده اند، از آن موقعيت كاري مطلع مي كنند . اگر قرار باشد شما يك سيستم نرم افزاري براي اين كار طراحي كنيد، طراحي شما به چه صورت خواهد بود؟ هر كدام از ما مي توانيم نسبت به درك خود از مسئله و سليقه كاري، طراح هاي مختلفي براي اين مسئله ارائه دهيم . اما يك است كه توانسته است بارها و بارها به اين مسئله پاسخ Observer طراحي كه مي تواند يك جواب خوب و عالي باشد، الگوي بدهد . در هر دو مسئله بالا، ما يك شي داريم كه مجموعه اي از اشياء به آن وابسته هستند . هر زماني كه وضعيت شي مورد نظر تغيير مي هاي مي ناميم و شي را كه ديگر Observer كند، اشياء ديگر از آن تغيير آگاه مي شوند . در اين الگو، مجموعه اشياء وابسته را مي ناميم . براي نمونه در مثال اول، افرادي كه در سايت عضو مي شوند يك Subject اشياء به آن وابسته هستند را هست . Subject هستند . و شي خبر، همان Observer شي يك وابستگي، يك به چند بين اشياء هست، هنگاميكه شي طرف يك، وضعيتش تغيير كند، اشياء وابسته Observer الگوي مطلع مي شوند و وضعيت خودشان را با توجه به آن وضعيت بروز رساني مي كنند . مكانيزم عملكرد اين الگو بصورت زير اس ت: و اطلاع از (u nregistering ) و انصراف از عضويت (r egistering ) بايد يك اينترفيس براي ثبت Subject - ۱ تغييرات را آماده كند . ها ارسال observer ها براي آن ريجستر شده اند را به observer ، بايد اطلاعات حالتي را كه Subject - ۲ كند . آماده كند . Subject بايد يك اينترفيس براي دريافت پيام از Observer - ۳ نمودار كلاس اين الگو بصورت زير است:
  • 48. الگوهاي طراحي ۴۸ با يك مثال ديگر كار را ادامه مي دهيم . فرض كنيد كه در اداره شما ، در داده هاي پايگاه داده مركزي تغييرات غير مجازي، داده شده است . براي حل اين مشكل مديران پيشنهاد كرده اند كه هر تغييري كه در پايگاه داده مي شود، بايد توسط يك پيام، به افراد را در نظر مي گيريد . دقيقا بر طبق نمودار عمل مي Observer مشخص شده اي اعلام شود . شما براي حل اين مشكل، الگوي كنيم و با يك حالت فرض اين مثال را پياده سازي مي كنيم . subject اينترفيس مربوط به Public Interface subject Sub Attach(ByVal Ins As Observer) Sub Detach(ByVal Ins As Observer) Sub Notify() End Interface Observer اينترفيس مربوط به Public Interface Observer Sub Update(ByVal operation As String, ByVal record AsString) End Interface را پياده سازي مي كند . subject كه اينترفيس مربوط به database كلاس Public Class dataBase Implements subject Private observers As ArrayList Private operation As String Private record As String Public Sub New() observers = New ArrayList End Sub Public Sub Attach(ByVal Ins As Observer) Implementssubject.Attach observers.Add(Ins) End Sub Public Sub Detach(ByVal Ins As Observer) Implementssubject.Detach observers.Remove(observers) End Sub Private Sub Notify() Implements subject.Notify For I As Integer = 0 To observers.Count – 1
  • 49. الگوهاي طراحي ۴۹ Dim Ins As Observer = observers(i) Ins.Update(operation, record) Next End Sub Public Sub editDatabase(ByVal ope As String, ByVal rec AsString) Me.operation = ope Me.record = rec Notify() End Sub End Class را پياده سازي مي كند . Observer كه اينترفيس Archiver كلاس Public Class Archiver Implements Observer Public Sub Update(ByVal operation As String, ByVal recordAs String) Implements Observer.Update MessageBox.Show("The archiver says a " + operation + " operation was performed on " + record) End Sub End Class را پياده سازي مي كند . Observer كه اينترفيس boss كلاس Public Class Boss Implements Observer Public Sub Update(ByVal operation As String, ByVal recordAs String) Implements Observer.Update MessageBox.Show("The boss says a " + operation + " operation was performed on " + record) End Sub End Class را پياده سازي مي كند . Observer كه اينترفيس client كلاس Public Class client Implements Observer Public Sub Update(ByVal operation As String, ByVal recordAs String) Implements Observer.Update MessageBox.Show("The client says a " + operation + " operation was performed on " + record) End Sub End Class تست Dim DB As New dataBase Dim Ar As New Archiver Dim Bo As New Boss Dim Cl As New client DB.Attach(Ar) DB.Attach(Bo) DB.Attach(Cl) DB.editDatabase("Delete", "Record 1") داريم . كه هر وقت تغييري در پايگاه داده اعمال مي شود، با يك پيام به آنها اعلام مي Observer در مثال بالا، ما سه نوع شود.