به منظور استفاده صحیح از الگوهای State و Strategy در برنامه های اصلی جاوا، برای برنامه نویسان جاوا مهم است که تفاوت بین آنها را به وضوح درک کنند. اگرچه هر دو الگو، State و Strategy، ساختار مشابهی دارند، و هر دو بر اساس اصل باز/بسته، نشان دهنده «O» در اصول SOLID هستند، اما از نظر قصد کاملاً متفاوت هستند . الگوی استراتژی در جاوا برای کپسوله کردن مجموعههای الگوریتمهای مرتبط به منظور ارائه انعطافپذیری اجرا به مشتری استفاده میشود . کلاینت می تواند هر الگوریتمی را در زمان اجرا بدون تغییر بافت کلاسی که از آن استفاده می کند انتخاب کند
Strategy
. برخی از نمونه های محبوب الگوی استراتژی نوشتن کدهایی است که از الگوریتم هایی مانند رمزگذاری، فشرده سازی یا مرتب سازی استفاده می کند. از سوی دیگر، الگوی State به یک شی اجازه می دهد تا در حالت های مختلف رفتار متفاوتی داشته باشد. از آنجایی که در دنیای واقعی یک شی اغلب حالتهایی دارد، و در حالتهای مختلف رفتار متفاوتی دارد، برای مثال، یک دستگاه خودکار فقط در صورتی کالا میفروشد که در حالت باشد hasCoin
، تا زمانی که یک سکه در آن نگذارید، نمیفروشد. اکنون به وضوح می توانید تفاوت بین الگوهای استراتژی و دولت را ببینید، اینها نیات متفاوتی هستند. الگوی State به یک شی کمک می کند تا حالت را مدیریت کند، در حالی که الگوی Strategy به مشتری اجازه می دهد رفتار متفاوتی را انتخاب کند. تفاوت دیگری که به راحتی قابل مشاهده نیست این است که چه کسی باعث تغییر رفتار می شود. در مورد الگوی Strategy، این یک مشتری است که استراتژی های مختلفی را برای زمینه ارائه می دهد؛ در الگوی State، انتقال توسط زمینه یا وضعیت خود شی کنترل می شود. بعلاوه، اگر خودتان تغییرات حالت را در شیء State مدیریت می کنید، باید ارجاعی به متن وجود داشته باشد، برای مثال، یک ماشین فروش باید بتواند متدی را setState()
برای تغییر وضعیت فعلی متن فراخوانی کند. از سوی دیگر، شی Strategy هرگز حاوی ارجاع به زمینه نیست؛ مشتری خود استراتژی انتخابی خود را به متن ارسال می کند. تفاوت بین الگوهای State و Strategy یکی از سوالات محبوب مصاحبه در مورد الگوهای جاوا است ، در این مقاله در مورد الگوهای جاوا نگاهی دقیق تر به آن خواهیم داشت. ما برخی از شباهت ها و تفاوت های بین الگوهای استراتژی و حالت در جاوا را بررسی خواهیم کرد که به شما در بهبود درک خود از این الگوها کمک می کند.
شباهت بین الگوهای دولت و استراتژی
اگر به نمودار UML الگوهای State و Strategy نگاه کنید، متوجه خواهید شد که هر دو شبیه به یکدیگر هستند. شی ای که از State برای تغییر رفتار خود استفاده می کند به عنوانContext
-object شناخته می شود، به طور مشابه شی ای که از Strategy برای تغییر رفتار خود استفاده می کند به عنوان Context
-object شناخته می شود. به یاد داشته باشید که کلاینت با Context
شی - تعامل دارد. در مورد الگوی State، Context متدها را به یک آبجکت State فراخوانی می دهد که به عنوان شی فعلی نگهداری می شود و در مورد الگوی Strategy، متن از شی Strategy به عنوان پارامتر استفاده می کند یا در حین ایجاد ارائه می شود. از زمینه شی نمودار UML الگوی حالت در جاوا این نمودار UML برای الگوی حالت، مشکل کلاسیک ایجاد یک طراحی ماشین فروش خودکار شی گرا در جاوا را به تصویر می کشد. می بینید که وضعیت ماشین فروش با استفاده از یک رابط نمایش داده می شود، که سپس یک پیاده سازی برای نشان دادن وضعیت خاص دارد. هر حالت همچنین دارای ارجاعاتی به زمینه شی است تا در نتیجه اقداماتی که در متن نامیده می شود، به حالت دیگری منتقل شود. نمودار UML الگوی استراتژی در جاوا این نمودار UML برای الگوی استراتژی شامل انواع پیاده سازی های کاربردی است. از آنجایی که الگوریتمهای مرتبسازی زیادی وجود دارد، این الگوی طراحی به مشتری اجازه میدهد هنگام مرتبسازی اشیا، الگوریتمی را انتخاب کند. در واقع چارچوب مجموعه جاوا از این الگو برای پیاده سازی روشی استفاده می کند Collections.sort()
که برای مرتب سازی اشیاء در جاوا استفاده می شود. تنها تفاوت این است که به جای اینکه به مشتری اجازه انتخاب یک الگوریتم مرتبسازی را بدهد، به او اجازه میدهد تا استراتژی مقایسه را با ارسال نمونهای از رابط مقایسه یا Comparable به جاوا مشخص کند . بیایید به چند شباهت بین این دو الگوی اصلی طراحی در جاوا نگاه کنیم:
- هر دو الگو، State و Strategy، اضافه کردن حالت و استراتژی جدید را بدون تأثیر بر بافت شی که از آنها استفاده می کند، آسان می کنند.
- هر دوی اینها کد شما را بر اساس اصل باز/بسته حفظ میکنند ، به این معنی که طرح برای برنامههای افزودنی باز است اما برای اصلاح بسته خواهد بود. در مورد الگوهای State و Strategy، زمینه شی به تغییرات، معرفی ایالات جدید یا استراتژیهای جدید بسته است، یا نیازی به تغییر بافت دولت دیگر یا حداقل تغییرات ندارید.
- همانطور که یک زمینه شی با حالت اولیه شی در الگوی State شروع می شود، یک بافت شی نیز دارای یک استراتژی پیش فرض در مورد الگوی Strategy در جاوا است.
- الگوی State نشان دهنده رفتارهای مختلف در قالب حالت های شی مختلف است، در حالی که الگوی استراتژی رفتارهای مختلف را در قالب استراتژی های شی متفاوت نشان می دهد.
- هر دو الگو، استراتژی و حالت، به زیر کلاس های اجرای رفتار بستگی دارند. هر استراتژی مشخص یک استراتژی انتزاعی را گسترش می دهد؛ هر حالت یک زیر کلاس از یک رابط یا کلاس انتزاعی است که برای نشان دادن دولت استفاده می شود.
تفاوت بین الگوهای استراتژی و حالت در جاوا
بنابراین اکنون می دانیم که الگوهای دولت و استراتژی از نظر ساختار مشابه هستند، اما هدف آنها متفاوت است. بیایید به برخی از تفاوت های کلیدی بین این الگوهای طراحی نگاه کنیم.- الگوی استراتژی مجموعهای از الگوریتمهای مرتبط را در بر میگیرد و به مشتری اجازه میدهد تا از رفتارهای قابل تعویض علیرغم ترکیب و تفویض اختیار در زمان اجرا استفاده کند، از سوی دیگر، الگوی State به کلاس کمک میکند تا رفتارهای متفاوتی را در حالتهای مختلف نشان دهد.
- تفاوت بعدی بین الگوهای State و Strategy این است که State وضعیت یک شی را در بر می گیرد ، در حالی که الگوی استراتژی یک الگوریتم یا استراتژی را محصور می کند. از آنجایی که حالت با یک شی مرتبط است، نمی توان از آن استفاده مجدد کرد، اما با جدا کردن یک استراتژی یا الگوریتم از زمینه آن، می توانیم دوباره از آن استفاده کنیم.
- در الگوی دولت، یک حالت شخصی ممکن است حاوی ارجاع به زمینه برای اجرای انتقال بین دولت ها باشد، اما یک استراتژی حاوی ارجاع به زمینه ای نیست که در آن استفاده می شود.
- اجرای یک Strategy را می توان به عنوان یک پارامتر به شی ای که از آن استفاده می کند، ارسال کرد، برای مثال Collection.sort() یک مقایسه کننده می گیرد که یک استراتژی است. از سوی دیگر، حالت بخشی از زمینه خود شی است و به مرور زمان بافت شی از حالتی به حالت دیگر تغییر می کند.
- اگرچه استراتژی و دولت هر دو از اصل باز/بسته پیروی می کنند، استراتژی نیز از اصل مسئولیت واحد پیروی می کند زیرا هر استراتژی شامل یک الگوریتم فردی است، استراتژی های مختلف مستقل از یکدیگر هستند. تغییر یک استراتژی مستلزم تغییر استراتژی دیگر نیست.
- تفاوت نظری دیگر بین الگوهای استراتژی و حالت این است که سازنده بخش "چگونه" از شی را تعریف می کند، به عنوان مثال، شی مرتب سازی "چگونه" داده ها را مرتب می کند، از سوی دیگر الگوی حالت، بخش های "چه" و "وقتی" را تعریف می کند. از شیء، به عنوان مثال، وقتی یک شی در حالت خاصی است، چه کاری می تواند انجام دهد.
- ترتیب انتقال حالت به خوبی در الگوی State تعریف شده است؛ چنین الزامی برای الگوی استراتژی وجود ندارد. مشتری در انتخاب هر گونه اجرای استراتژی به انتخاب خود آزاد است.
- برخی از نمونههای رایج الگوی استراتژی عبارتند از کپسولهسازی الگوریتمها، مانند الگوریتمهای مرتبسازی، الگوریتمهای رمزگذاری یا الگوریتم فشردهسازی. اگر می بینید که کد شما باید از انواع مختلفی از الگوریتم های مرتبط استفاده کند، باید از الگوی استراتژی استفاده کنید. از سوی دیگر، تشخیص استفاده از الگوی State بسیار آسان است، اگر نیاز به مدیریت انتقال حالت و حالت بدون عبارات شرطی تو در تو دارید، الگوی State الگوی مناسبی برای استفاده است.
- آخرین اما یکی از مهمترین تفاوتهای بین الگوهای State و Strategy این است که تغییر در Strategy توسط Client انجام میشود، در حالی که تغییر به State میتواند توسط متن یا خود وضعیت شی انجام شود.
GO TO FULL VERSION