دوره های آموزشی سایت دانشجویار

Design Pattern و Adapter و پرسش ‏های متداول – بخش سوم

Loading...

Design Pattern و Adapter و پرسش ‏های متداول – بخش سوم،  در این مقاله‏ ادامه ‏ی  پرسش ‏های متداول الگوی طراحی بخش ۱ و ۲ است. در این مقاله سعی خواهیم کرد تا الگوی وضعیت ( State )، استراتژی ( Strategy)، بازدید کننده( Visitor )، وفق دهنده( Adapter ) و الگوی مگس وزن ( Fly weight ) را درک کنیم.

در صورتی که در زمینه‏ ی الگوهای طراحی کاملا تازه وارد هستید و اگر بخش قبلی مطالب را نخوانده ‏اید همواره می‏توانید آن را در لینک‏ زیر بخوانید.

ممکن است الگوی وضعیت را توضیح دهید؟

الگوی وضعیت به یک شیء اجازه می‏دهد تا رفتار خود را بسته به مقادیر فعلی شیء تغییر دهد.

تصویر “مثال الگوی وضعیت” را در نظر بگیرید. مثالی از عملیات لامپ است.

اگر وضعیت لامپ ، خاموش باشد و کلید را فشار دهید، لامپ روشن می‏شود.

اگر وضعیت لامپ روشن باشد و کلید را بفشارید، لامپ خاموش می‏شود. بنابراین بطور خلاصه، بسته به وضعیت، رفتار تغییر می‏کند.

Design Pattern و Adapter

مثال الگوی وضعیت در Design Pattern و Adapter

حال بگذارید سعی کنیم همان مثال لامپ را در سی شارپ  پیاده سازی کنیم.

تصویر “الگوی وضعیت در عمل” هم کد کلاس و هم کد سرویس گیرنده را نشان می‏دهد.

کلاسی تحت عنوان ‘clsState’ که یک enum (نوع شمارشی) با دو ثابت وضعیت ‘On’ و ‘Off’ دارد ساخته ‏ایم.

یک متد ‘PressSwitch’ تعریف کرده ‏ایم که وضعیت خود را بسته به وضعیت فعلی تغییر می‏دهد.

در طرف راست همین تصویر، یک سرویس گیرنده تعریف کرده‏ ایم که از کلاس ‘clsState’ استفاده کرده و متد ‘PressSwitch()’ را فراخوانی می‏کند.

وضعیت فعلی را در جعبه‏ ی متنی (textbox) با استفاده از تابع ‘getStatus’ نمایش داده‏ ایم.

هنگامیکه press switch (فشردن دکمه) را کلیک می‏کنیم، به وضعیت مخالف وضعیتی که در حال حاضر داریم تغییر می‏کند.

Design Pattern و Adapter

الگوی وضعیت در عمل در Design Pattern و Adapter

ممکن است الگوی استراتژی را توضیح دهید؟

الگوی استراتژی الگوریتم‏ هایی داخل یک کلاس است که می‏تواند بسته به کلاس مورد استفاده تغییر کند.

این الگو هنگامی مفید است که بخواهید تصمیم بگیرید کدام الگوریتم در زمان اجرا استفاده شود.

بگذارید مثالی از نحوه‏ ی کار الگوی استراتژی را در عمل ببینیم.

بیایید مثالی از یک محاسبات ریاضی که در آن استراتژی‏ هایی مانند جمع و تفریق داریم را بررسی کنیم.

تصویر “استراتژی در عمل” همین موضوع را در قالب تصویری نشان می‏دهد. دو عدد گرفته و بسته به استراتژی، نتیجه می‏دهد.

بنابراین اگر استراتژی جمع باشد، اعداد را جمع خواهد کرد، اگر استراتژی تفریق باشد، نتیجه‏ ی تفریق شده را خواهد داد.

این استراتژی ‏ها چیزی جز الگوریتم نیستند. الگوی استراتژی چیزی جز کپسوله سازی الگوریتم ‏ها داخل کلاس‏ها نیست.

Design Pattern و Adapter

استراتژی در عمل در Design Pattern و Adapter

بنابراین اولین چیزی که بررسی کنیم این است که چگونه این الگوریتم ‏ها می‏توانند داخل کلاس‏ها کپسوله شوند.

تصویر زیر “الگوریتم کپسوله شده” نحوه‏ ی کپسوله شدن ‘add’ (جمع) داخل کلاس ‘clsAddStrategy’ و ‘substract’ (تفریق) در کلاس ‘clsSubstractStrategy’ را نشان می‏دهد.

هر دوی این کلاس‏ها از ‘clsStrategy’ یک متد ‘calculate’ (محاسبه) برای کلاس ‏های فرزندش تعریف می‏کند ارث می‏برند.

Design Pattern و Adapter

الگوریتم‏ های کپسوله شده در Design Pattern و Adapter

حال یک کلاس wrapper (پوشش) تحت عنوان ‘clsMath’ که ارجاعی به کلاس ‘clsStrategy’ دارد تعریف می‏کنیم.

این کلاس یک متد ‘setStrategy’ دارد که استراتژی جهت استفاده را تعیین می‏کند.

Design Pattern و Adapter

استراتژی و کلاس wrapper در Design Pattern و Adapter

تصویر زیر “کد سرویس گیرنده ‏ی استراتژی” نحوه‎ی به کارگیری کلاس wrapper را نشان می‏دهد و شیء استراتژی با استفاده از متد ‘setStrategy’ بر روی زمان اجرا تنظیم شده است.

Design Pattern و Adapter

کد سرویس گیرنده‏ ی استراتژی در Design Pattern و Adapter

ممکن است الگوی بازدید کننده  را توضیح دهید؟

الگوی بازدید کننده به ما امکان تغییر ساختار کلاس بدون تغییر کلاس حقیقی را می‏دهد.

این الگو روشی برای جداسازی منطق و الگوریتم از ساختار داده‏ی فعلی است.

از این رو می‏توانید منطقی جدید بدون تغییر ساختار به ساختار داده‏ ی فعلی بیفزایید.

ثانیاً می‏توانید ساختار را بدون تغییر و دستکاری منطق تغییر دهید.

تصویر زیر “منطق و ساختار داده” را در نظر بگیرید که در آن یک ساختار داده ‏ی مشتری داریم.

هر شیء مشتری چندین شیء آدرس و هر شیء آدرس چندین شیء تلفن دارد.

این ساختار داده نیاز دارد تا در دو قالب مختلف ، که یکی رشته‏ ی ساده و دومی XML است نمایش داده شود.

بنابراین دو کلاس نوشته‏ ایم، که یکی کلاس منطق رشته و دیگری کلاس منطق XML است.

این دو کلاس، ساختار شیء را پیمایش کرده و خروجی‏ های مربوطه را می‏دهند. بطور مختصر، بازدید کننده، منطق را شامل می‏شود.

Design Pattern و Adapter

منطق و ساختار داده در Design Pattern و Adapter

بیایید مثال مشتری فوق را در نظر گرفته و سعی کنیم همان را در سی شارپ  پیاده سازی کنیم.

اگر باز زبان برنامه نویسی دیگری کار می‏کنید باید بتوانید به آن را به همان ترتیب با زبان خود تطابق دهید.

ما دو کلاس بازدید کننده ایجاد کرده‏ ایم که یکی جهت عمل تجزیه برای منطق رشته و دیگری برای XML استفاده خواهد شد.

هر دوی این کلاس‏ها یک متد بازدید دارند که هر شیء را گرفته و به همان ترتیب تجزیه می‏کند.

جهت حفظ هماهنگی و تناسب، آن‏ها را از یک رابط معمول و مشترک ‘IVisitor’ پیاده سازی کرده ‏ایم.

Design Pattern و Adapter

کلاس بازدید کننده در Design Pattern و Adapter

کلاس بازدید کننده ‏ی تعریف شده‏ ی فوق به کلاس ساختار داده یعنی، یعنی کلاس مشتری، ارسال خواهد شد.

بنابراین در کلاس مشتری، کلاس بازدید کننده را در یک تابع ‘Accept’ (پذیرش) فرستاده ‏ایم.

در همان تابع، این نوع کلاس را فرستاده و تابع بازدید را فراخوانی می‏کنیم.

تابع بازدید سربارگذاری شده تا بر اساس نوع کلاس ارسال شده عمل فراخوانی را انجام دهد.

Design Pattern و Adapter

بازدید کننده ارسال شده به کلاس ساختار داده در Design Pattern و Adapter

حال هر مشتری چندین شیء آدرس و هر آدرس چندین شیء تلفن دارد.

بنابراین، شیء لیست آرایه ‏ای (arraylist) ‘objAddresses’ در کلاس ‘clsCustomer’ و لیست آرایه ‏ای ‘objPhones’ در کلاس ‘clsAddress’ تجمیع شده است.

هر شیء متد پذیرش (accept) را دارد که کلاس بازدید کننده را گرفته و خود را به تابع بازدید از کلاس بازدید کننده می‏فرستد.

از آنجاییکه تابع بازدید کلاس بازدید کننده سربارگذاری شده است، متد بازدید کننده‏ ی مناسب را به ازای هر چند ریختی فراخوانی می‏کند.

Design Pattern و Adapter

مشتری، آدرس و تلفن ‏ها در Design Pattern و Adapter

حال که منطق در کلاس ‏های بازدید کننده و ساختار داده در کلاس‏ های مشتری را داریم، زمان این است که آن‏ها را در سرویس گیرنده استفاده کنیم.

تصویر زیر “کد سرویس گیرنده‏ ی بازدید کننده”، یک قطعه کد نمونه برای بکارگیری الگوی بازدید کننده را نشان می‏دهد.

بنابراین شیء بازدید کننده را ایجاد و به کلاس داده‏ های مشتری می‏فرستیم.

اگر بخواهیم ساختار شیء مشتری را در قالب یک رشته نمایش دهیم، ‘clsVisitorString’ را ایجاد می‏کنیم و اگر بخواهیم در قالب XML تولید کنیم، شیء ‘clsXML’ را ایجاد کرده و همان را به ساختار داده‏ ی شیء مشتری ارسال می‏کنیم.

می‏توانید به آسانی مشاهده کنید که منطق اکنون چگونه از ساختار داده جدا شده است.

Design Pattern و Adapter

کد سرویس گیرنده‏ ی بازدید کننده در Design Pattern و Adapter

تفاوت بین الگوی بازدید کننده و استراتژی چیست؟

بازدید کننده و استراتژی از آنجا که با منطق پیچیده ‏ی کپسوله سازی از داده در ارتباطند، بسیار شبیه به هم هستند. می‏توان گفت بازدید کننده شکل عمومی‏تر استراتژی است.

در استراتژی یک متن (context) یا یک تک داده‏ ی منطقی داریم که چندین الگوریتم بر روی آن عمل می‏کنند. در پرسش قبل، مبانی استراتژی و بازدید کننده را توضیح دادیم.

بنابراین بیایید همان مفاهیم را با استفاده از مثال ‏هایی که پیش از این مطرح کردیم درک کنیم. در استراتژی، یک تک متن داریم و چندین الگوریتم بر روی آن کار می‏کنند.

تصویر “استراتژی” نشان می‏دهد که چگونه یک متن داده ‏ای (data context) داریم و چندین الگوریتم بر روی آن کار/عمل می‏کنند.

Design Pattern و Adapter

استراتژی در Design Pattern و Adapter

در بازدید کننده، چندین متن و برای هر متن،یک الگوریتم داریم.

Design Pattern و Adapter

بازدید کننده در Design Pattern و Adapter

بنابراین بطور خلاصه، استراتژی نوعی خاص از بازدید کننده است. در استراتژی یک متن داده‏ ای و چندین الگوریتم داریم در حالیکه در بازدید کننده برای هر متن داده ‏ای یک الگوریتم متناظر داریم.

معیار اساسی انتخاب اینکه استراتژی را پیاده سازی کنیم یا بازدید کننده، به ارتباط بین متن و الگوریتم بستگی دارد.

اگر یک متن و چندین الگوریتم باشد، سراغ استراتژی می‏رویم. اگر چندین متن و چندین الگوریتم داشته باشیم، الگوریتم بازدید کننده را پیاده سازی می‏کنیم.

ممکن است الگوی وفق دهنده را توضیح دهید؟

بسیاری از اوقات دو کلاس به دلیل رابط‏ه ای ناسازگار، با یکدیگر ناسازگارند.

وفق دهنده به ما کمک می‏کند تا یک کلاس را حول کلاس موجود wrap کرده (پوشش دهیم) و کلاس‏ها را با یکدیگر سازگار کنیم.

شکل زیر “رابط‏ه ای ناسازگار” را در نظر بگیرید، هر دوی آن‏ها مجموعه‏ هایی برای نگهداری مقادیر رشته ‏ای هستند.

هر دو متدی دارند که به ما در افزودن رشته به مجموعه کمک می‏کند.

یکی از متدها به عنوان ‘Add’ (افزودن) و دیگری ‘push’ (قرار دادن داده بر روی پشته) نامگذاری شده است.

یکی از آن‏ها از شیء مجموعه و دیگری از پشته استفاده می‏کند. ما می‏خواهیم شیء پشته را با شیء مجموعه سازگار کنیم.

Design Pattern و Adapter

رابط‏ه ای ناسازگار در Design Pattern و Adapter

دو روش برای پیاده سازی الگوی وفق دهنده وجود دارد، یکی با استفاده از تجمیع (این مورد اصطلاحاً به عنوان الگوی وفق دهنده‏ ی شیء ذکر می‏شود) و دیگری ارث‏ بری (از این مورد اصطلاحاً به عنوان الگوی وفق دهنده‏ ی کلاس یاد می‏شود).

ابتدا بگذارید سعی کنیم الگوی وفق دهنده‏ ی شیء را پوشش دهیم.

تصویر “الگوی وفق دهنده‏ ی شیء” دید گسترده‏ تری از اینکه چگونه می‏توانیم به آن دست یابیم نشان می‏دهد.

یک کلاس wrapper جدید ‘clsCollectionAdapter’ معرفی کرده‏ ایم که در بالای کلاس ‘clsStack’ wrap می‏شود و متد ‘push’ را داخل یک متد ‘Add’ جدید تجمیع می‏کند، بدین گونه هر دو کلاس را سازگار می‏کند.

Design Pattern و Adapter

الگوی وفق دهنده‏ ی شیء در Design Pattern و Adapter

روش دیگر پیاده سازی الگوی وفق دهنده با استفاده از ارث‏ بری یا اصطلاحاً الگوی وفق دهنده‏ ی کلاس است.

تصویر “الگوی وفق دهنده ‏ی کلاس” نشان می‏دهد که چگونه کلاس ‘clsStack’ را در ‘clsCollectionAdapter’ به ارث برده و آن را با کلاس ‘clsCollection’ سازگار کرده ‏ایم.

Design Pattern و Adapter

الگوی وفق دهنده ‏ی کلاس در Design Pattern و Adapter

الگوی مگس وزن در Design Pattern و Adapter  چیست؟

الگوی مگس وزن هنگامی مفید است که نیاز داریم تعداد زیادی شیء ایجاد کنیم و تمامی این اشیاء دارای برخی داده‏ های مشترک هستند.

تصویر “اشیاء و داده‏ه ای مشترک” را در نظر بگیرید. لازم است برای تمام کارمندان سازمان کارت ویزیت پرینت کنیم.

بنابراین دو بخش داده داریم، یکی داده‏ ی متغیر یعنی نام کارمند و دیگری داده‏ ی ثابت (static) یعنی آدرس است.

می‏توانیم حافظه را تنها از طریق نگهداری یک کپی از داده‏ ی ثابت و ارجاع به همان داده در تمامی اشیاء داده ‏ی متغیر به حداقل برسانیم.

بنابراین کپی ‏های متفاوتی از داده‏ ی متغیر ایجاد می‏کنیم، اما به کپی همان داده‏ ی ثابت ارجاع می‏دهیم.

با این کار می‏توانیم از حافظه بطور بهینه استفاده کنیم.

Design Pattern و Adapter

اشیاء و داده‏ه ای مشترک در Design Pattern و Adapter

در ادامه بازنمایی یک کد ساده ‏ی سی شارپ از اینکه مگس وزن در عمل چگونه می‏تواند پیاده سازی شود آمده است.

دو کلاس داریم، ‘clsVariableAddress’ که داده‏ ی متغیر را دارد و دومی ‘clsAddress’ که داده‏ ی ثابت را دارد.

جهت اطمینان از اینکه تنها یک نمونه از ‘clsAddress’ داریم، یک کلاس wrapper ‘clsStatic’ ساخته و یک نمونه‏ ی ثابت از کلاس ‘clsAddress’ ایجاد کرده ‏ایم.

این شیء در کلاس ‘clsVariableAddress’ تجمیع شده است.

Design Pattern و Adapter

نمایش کلاسی مگس وزن در Design Pattern و Adapter

تصویر “کد سرویس گیرنده ‏ی مگس وزن” نشان می‏دهد که دو شیء از کلاس ‘clsVariableAddress’ ایجاد کرده‏ ایم، اما از درون، داده‏ ی ثابت، یعنی آدرس، تنها به یک نمونه ارجاع دارد.

Design Pattern و Adapter

کد سرویس گیرنده‏ ی مگس وزن در Design Pattern و Adapter

 



مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۳۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره--
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۶۵,۵۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...