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

آموزش الگوی طراحی و پرسش ‏های متداول – بخش دوم

Loading...
آموزش الگوی طراحی

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

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

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

آموزش الگوی طراحی به همراه یک پروژه

بهترین روش برای یادگیری آموزش الگوی طراحی انجام یک پروژه است.

آموزش الگوی طراحی مفسر چیست؟

الگوی مفسر به ما اجازه می‌دهد تا گرامر را به راه حل ‏هایی در قالب کد (Code Solutions) تفسیر کنیم.

بسیار خوب، این به چه معناست؟ گرامرها به کلاس‌ها نگاشت می‌شوند تا به یک راه حل برسند.

برای نمونه ۲-۷ می‌تواند به کلاس ‘clsMinus’ نگاشت شود.

در یک خط، الگوی مفسر راه حل چگونگی نوشتن یک مفسر که بتواند یک گرامر را خوانده و همان را در کد اجرا کند را به ما می‌دهد.

برای نمونه، در ادامه یک مثال ساده است ، که در آن می‌توانیم گرامر قالب تاریخ را بدهیم و مفسر همان را ، به راه حل‌هایی در قالب کد تبدیل کرده و خروجی مطلوب را خواهد داد.

آموزش الگوی طراحی

گرامر تاریخ در آموزش الگوی طراحی

بیایید یک مفسر برای قالب‌های تاریخ همانطور که در تصویر “گرامر تاریخ” نشان داده شده بسازیم.

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

متن (Context) شامل داده‌ها و بخش منطق ،شامل منطقی است که متن را به قالب قابل خواندن تبدیل خواهد کرد.

آموزش الگوی طراحی

متن و منطق در آموزش الگوی طراحی

بگذارید درک کنیم که گرامر در قالب تاریخ چیست.

برای تعریف هر گرامری ابتدا باید گرامر را به اجزای منطقی کوچکی بشکنیم.

تصویر “گرامر نگاشت شده به کلاس‌ها” نشان می‌دهد که اجزای مختلف چگونه شناسایی شده و سپس به کلاس‌هایی که منطق پیاده سازی تنها همان بخش گرامر را دارند نگاشت می‌شوند.

بنابراین قالب تاریخ را به چهار جزء Month (ماه)، Day (روز) و Year (سال) و جدا کننده شکسته‌ایم.

برای تمامی این چهار جزء، کلاس‌هایی مجزا که شامل منطق خواهند بود تعریف می‌کنیم.

همانطور که در تصویر “گرامر نگاشت شده به کلاس‌ها” نشان داده شده‌است.

بنابراین، کلاس‌های متفاوتی برای اجزای مختلف قالب تاریخ ایجاد خواهیم کرد.

آموزش الگوی طراحی

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

همانطور که گفته شد، دو کلاس وجود دارد.

یک کلاس عبارت (expression) که منطق را در بر دارد و دیگری کلاس متن (context) که داده را در بر دارد همانطور که در تصویر “کلاس‌های عبارت و متن” نشان داده شده است.

تمامی عبارات تجزیه شده در کلاس‌های مختلف را تعریف کرده‌ایم.

تمامی این کلاس‌ها از رابط مشترک و معمول‘ClsAbstractExpression’ با یک متد ‘Evaluate’ ارث می‌برند.

متد ‘Evaluate’، یک کلاس متن که داده‌ها را دارد می‌گیرد؛ این متد داده‌ها را بر اساس منطق عبارت تجزیه می‌کند.

برای نمونه ‘ClsYearExpression’، ‘YYYY’ را با مقدار سال جایگزین می‌کند، ‘ClsMonthExpression’، ‘MM’ را با مقدار ماه جایگزین می‌کند و به همین روال برای دیگر موارد.

آموزش الگوی طراحی

نمودار کلاس برای مفسر در آموزش الگوی طراحی

 

آموزش الگوی طراحی

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

حال که منطق تجزیه‌ی عبارت در کلاس‌های مختلف را جدا کرده‌ایم.

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

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

بنابراین اگر یک ‘DD’ پیدا کنیم، ‘ClsDayExpression’ را اضافه کنیم، اگر ‘MM’ بیابیم، ‘ClsMonthExpression’ را می‌افزاییم و به همین ترتیب برای دیگر موارد، در نهایت تنها حلقه می‌زنیم و متد ‘Evaluate’ را فراخوانی می‌کنیم.

هنگامی که تمامی متدهای evaluate فرا خوانده شدند، خروجی را نمایش می‌دهیم.

آموزش الگوی طراحی

منطق مفسر سرویس گیرنده در آموزش الگوی طراحی

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

الگوی تکرار کننده دسترسی بطور مرتب به عناصر بدون آشکارسازی کد داخلی را مجاز می‌کند.بگذارید ببینیم معنای آن چیست.

بیایید در نظر بگیریم شما مجموعه‌ای از رکوردها/سوابق دارید که می‌خواهید بطور مرتب آن‌ها را جستجو کرده و همچنین مکان فعلی که سوابق در آن جستجو می‌شوند را حفظ کنید، پس پاسخ، الگوی تکرار کننده است.

این الگو، رایج‌ترین الگوی استفاده شده و بصورت ناخودآگاه است.

هرگاه یک حلقه‏ ی ‘foreach’ (به ما اجازه می‌دهد تا بطور مرتب در مجموعه با حلقه پیش برویم) استفاده می‌کنید، تا به حال تا حدودی در حال استفاده از الگوی تکرار کننده هستید.

آموزش الگوی طراحی

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

در تصویر “منطق کسب و کار تکرار کننده” کلاس ‘clsIterator’ را داریم که مجموعه‌ای از کلاس‌های مشتری دارد.

بنابراین یک لیست آرایه‌ای (array list) داخل کلاس ‘clsIterator’ و یک متد ‘FillObjects’ تعریف کرده‌ایم که لیست آرایه‌ای را با داده‌ها بارگذاری می‌کند.

لیست آرایه‌ای مجموعه ‏ی مشتری خصوصی (private) است و داده‌های مشتری می‌توانند از طریق اندیس لیست آرایه‌ای یافت و بررسی شوند.

بنابراین توابعی عمومی (public) مانند ‘getByIndex’ (که می‌تواند با استفاده از یک اندیس مشخص جستجو کند)، ‘Prev’ (مشتری قبلی در مجموعه را می‌گیرد)، ‘Next’ (مشتری بعدی در مجموعه را می‌گیرد)، ‘getFirst’ (اولین مشتری در مجموعه را می‌گیرد) و ‘getLast’ (آخرین مشتری در مجموعه را می‌گیرد) را داریم.

بنابراین این توابع تنها برای سرویس گیرنده آشکار است. این توابع به دسترسی مرتب به مجموعه رسیدگی کرده و همچنین اندیس مورد دسترس قرار گرفته را به حافظه می‌سپارند.

تصویر زیر “منطق تکرار کننده‌ی سرویس گیرنده” ، نشان می‌دهد که چگونه شیء ‘ObjIterator’ که از کلاس ‘clsIterator’ ایجاد شده جهت نمایش بعدی، قبلی، آخرین، اولین و مشتری توسط اندیس مورد استفاده قرار می‌گیرد.

آموزش الگوی طراحی

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

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

بسیاری از اوقات در پروژه‌ها، ارتباط بین اجزا/کامپوننت‌ها پیچیده است. از این رو، منطق بین اجزا بسیار پیچیده می‌شود.

الگوی میانجی به اشیاء کمک می‌کند تا به شیوه‌ای مجزا و تفکیک شده ارتباط برقرار کنند، که این امر به حداقل شدن پیچیدگی می‌انجامد.

آموزش الگوی طراحی

مثال نمونه ‏ی میانجی در آموزش الگوی طراحی

بیایید تصویر “مثال نمونه‌ی میانجی” را در نظر بگیریم که سناریوی واقعی نیاز به الگوی میانجی را نمایش می‌دهد.

رابط کاربری بسیار کاربر پسندی است و سه سناریوی معمول دارد.

سناریوی اول : هنگامیکه یک کاربر در جعبه‌ی متنی (text box) می‌نویسد، باید دکمه ‏ی افزودن (add) و پاک کردن (clear) را فعال کند.

در صورتی که چیزی در جعبه‌ی متنی نباشد، باید دکمه‌ی افزودن و پاک کردن را غیر فعال کند.

آموزش الگوی طراحی

سناریو اول در آموزش الگوی طراحی

سناریوی دوم: هنگامیکه کاربر روی دکمه‏ ی افزودن کلیک می‌کند، داده باید وارد جعبه‏ ی لیست (list box) شود. هنگامیکه داده وارد جعبه‌ی لیست شد، باید جعبه‌ی متنی را پاک کرده و دکمه‌ی افزودن و پاک کردن را غیر فعال کند.

آموزش الگوی طراحی

سناریو دوم در آموزش الگوی طراحی

سناریوی سوم: اگر کاربر دکمه‌ی پاک کردن را کلیک کند، باید جعبه‏ ی متن نام را پاک کرده و دکمه افزودن و پاک کردن را غیرفعال کند.

آموزش الگوی طراحی

سناریو سوم در آموزش الگوی طراحی

حال با نگاه به سناریوهای بالا برای رابط کاربری (UI) می‌توانیم نتیجه بگیریم که برهم کنش بین این رابط‌های کاربری چقدر پیچیده خواهد بود.

تصویر زیر “برهم کنش‌های پیچیده بین اجزاء” بیانگر پیچیدگی منطقی است.

آموزش الگوی طراحی

برهم کنش ‏های پیچیده بین اجزا در آموزش الگوی طراحی

بسیار خوب، حال بگذارید به شما تصویر خوبی که در ادامه آمده ( “ساده سازی با استفاده از میانجی” ) را نشان دهم.

بجای اینکه اجزاء بطور مستقیم با یکدیگر ارتباط داشته باشند، اگر با جزئی متمرکز مانند میانجی ارتباط برقرار کنند و سپس میانجی به فرستادن پیام‌ها به دیگر اجزاء رسیدگی کند، منطق تمیز‌ و مرتب خواهد بود.

آموزش الگوی طراحی

ساده سازی با استفاده از میانجی در آموزش الگوی طراحی

حال بیایید نگاهی بیندازیم به ظاهری که کد خواهد داشت. ما از سی شارپ استفاده خواهیم کرد اما شما می‌توانید به آسانی این فکر و ایده را در JAVA یا هر زبان انتخابی دیگری تکرار کنید.

تصویر زیر “کلاس میانجی” نمای کلی کد کامل را نشان می‌دهد که ظاهر کلاس میانجی به چه صورت خواهد بود.

اولین کاری که کلاس میانجی انجام می‌دهد این است که، ارجاعات کلاس‌هایی که ارتباط پیچیده دارند را می‌گیرد.بنابراین در اینجا سه متد سربارگذاری شده به نام ‘Register’ را نشان داده‌ایم.

متد ‘Register’ شیء جعبه‌ی متنی و اشیاء دکمه را می‌گیرد. سناریوهای بر هم کنش در متد‌های ‘ClickAddButton’، ‘TextChange’ و ‘ClickClearButton’ متمرکز شده‌اند.

این متدها به فعال سازی و غیرفعال سازی اجزای رابط کاربری بر اساس سناریوها رسیدگی می‌کنند.

آموزش الگوی طراحی

کلاس میانجی در آموزش الگوی طراحی

حال منطق سرویس گیرنده بسیار تمیز و مرتب است.

در سازنده ابتدا تمامی اجزاء به همراه برهم کنش‌های پیچیده با میانجی را ثبت می‌کنیم.

حال برای هر سناریو تنها متدهای میانجی را فراخوانی می‌کنیم.

بطور خلاصه، هنگامیکه تغییری در متن رخ داد، می‌توانیم متد ‘TextChange’ میانجی را فراخوانی کنیم زمانی که کاربر افزودن (add) را کلیک می‌کند، متد ‘ClickAddButton’ را فراخوانی می‌کنیم و برای کلیک پاک کردن (clear)، ‘ClickClearButton’ را فراخوانی می‌کنیم.

آموزش الگوی طراحی

منطق سرویس گیرنده‏ ی میانجی در آموزش الگوی طراحی

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

الگوی یادگاری روشی برای گرفتن و ضبط وضعیت داخلی اشیاء ، بدون نقض کپسوله سازی است.

الگوی یادگاری به ما کمک می‌کند تا یک تصویر لحظه‌ای که می‌تواند در هر لحظه از زمان توسط شیء بازگشت داده شود را ذخیره کنیم.

بگذارید در عمل ، درک کنیم که این به چه معناست.تصویر “مثال عملی یادگاری” را در نظر بگیرید، صفحه نمایش یک مشتری را نشان می‌دهد.

بگذارید فرض کنیم کاربر شروع به تصحیح رکورد یک مشتری کرده و تعدادی تغییر ایجاد می‌کند.

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

این جایی است که یادگاری وارد صحنه می‌شود.

به ما کمک خواهد کرد تا یک کپی از داده‌ها را ذخیره کرده و در صورتی که کاربر لغو (cancel) را بفشارد، شیء به وضعیت اصلی خود باز گردد.

آموزش الگوی طراحی

مثال عملی یادگاری در آموزش الگوی طراحی

بیایید سعی کنیم همان مثال را در سی شارپ برای رابط کاربری مشتری که به تازگی آن را بررسی کردیم، کامل کنیم.

در ادامه کلاس مشتری ‘clsCustomer’ آمده است که کلاس یادگاری تجمیع شده ‘clsCustomerMemento’، که تصویر لحظه‌ای داده‌ها را حفظ خواهد کرد، دارد.

کلاس یادگاری ‘clsCustomerMemento’ کپی دقیق (به جز متدها) کلاس مشتری ‘clsCustomer’ است.

هنگامیکه کلاس مشتری ‘clsCustomer’ مقدار دهی اولیه می‌شود، کلاس یادگاری نیز مقدار اولیه می‌گیرد.

هنگامیکه داده‌های کلاس مشتری تغییر کند، تصویر لحظه‌ای کلاس یادگاری تغییر نمی‌کند. متد ‘Revert’ (بازگشت) داده‌های یادگاری را به کلاس اصلی باز می‌گرداند.

آموزش الگوی طراحی

کلاس مشتری برای یادگاری در آموزش الگوی طراحی

کد سرویس گیرنده بسیار ساده است.

در صورتیکه مشکلی برایمان پیش بیاید، دکمه‌ی لغو (cancel) را کلیک می‌کنیم که در عوض متد ‘revert’ را فراخوانی کرده و داده‌های تغییر یافته را به داده‌های تصویر لحظه‌ای یادگاری باز می‌گرداند.

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

آموزش الگوی طراحی

کد سرویس گیرنده ‏ی یادگاری در آموزش الگوی طراحی

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

الگوی ناظر به ما کمک می‌کند تا بین کلاس والد/پدر و کلاس‌های مرتبط یا وابسته ارتباط برقرار کنیم.

دو مفهوم مهم در الگوی ناظر وجود دارد، ‘Subject’ (فاعل) و ‘Observers’ (ناظرها).

subject اعلانات را ارسال می‌کند در حالیکه observerها درصورتیکه با subject ثبت شده باشند، اعلانات را دریافت می‌کنند.

تصویر زیر ” subjectsو observers” نشان می‌دهد که چگونه برنامه (subject) اعلاناتی را به تمام observerها (پست الکترونیکی/email، گزارش رویداد/event log، پیام کوتاه/SMS) می‌فرستد.

می‌توانید این مثال را به مدل ناشر (publisher) و مشترک (subscriber) نگاشت کنید.ناشر، برنامه و مشترکین email، event log و sms هستند.

آموزش الگوی طراحی

Subject و Observerها در آموزش الگوی طراحی

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

ابتدا بیایید نگاهی به کلاس‌های مشترک/اعلان بیندازیم.تصویر “کلاس‌های مشترک” آن را بصورت تصویری نشان می‌دهد.

بنابراین یک رابط مشترک برای تمام مشترکین داریم، یعنی ‘INotification’ که یک متد ‘notify’ (اعلان) دارد.

این رابط ‘INotification’ بوسیله‏ ی تمام کلاس‌های عینی اعلان پیاده سازی شده است.

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

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

آموزش الگوی طراحی

کلاس‏ های مشترک در آموزش الگوی طراحی

همانطور که پیش‌تر گفته شد، دو بخش در یک الگوی ناظر وجود دارد.

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

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

با استفاده از ‘addNotification’ و ‘removeNotification’ می‌توانیم مشترکین را به لیست آرایه‌ای اضافه و یا از آن حذف کنیم.

متد ‘NotifyAll’ در تمامی مشترکین بصورت حلقه‌ای پیش رفته و اعلان را می‌فرستد.

آموزش الگوی طراحی

کلاس‏های ناشر/فاعل در آموزش الگوی طراحی

حال که ذهنیتی در رابطه با کلاس‌های ناشر و مشترک داریم، بیایید سرویس گیرنده را کد نویسی کنیم و ناظر را در عمل مشاهده کنیم.

در ادامه قطعه کدی برای سرویس گیرنده‌ی ناظر آمده است.

بنابراین ابتدا شیء اعلان کننده که مجموعه اشیاء متحرک را دارد ایجاد می‌کنیم.

تمام مشترکینی که نیاز است اعلان شوند را به مجموعه اضافه می‌کنیم.

حال اگر طول کد مشتری بیش از ۱۰ کاراکتر باشد، می‌گوییم که به تمام مشترکین در همین رابطه اعلان نماید.

آموزش الگوی طراحی

کد سرویس گیرنده‏ ی ناظر در آموزش الگوی طراحی



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


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 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...