State pattern چیست؟ و تفاوتش با Strategy pattern چیست؟
اگر بخواهیم جایگاه الگوی طراحی State را در طبقه بندی الگو های طراحی بررسی کنیم، مشخص میشود که این الگو بر اساس هدف، جزء الگو های رفتاری یا Behavioral بوده و بر اساس حوزه، در دسته Object قرار گرفته است.
این الگو کاری میکند که ارتباطات بین کلاسها و موجودیت ها کنترل شود و میتوان آن را نسخه پویا و داینامیک الگوی strategy دانست. رفتار این الگو به این شکل است که وقتی حالت داخلی یک شی تغییر میکند، با توجه به آن تغییر، برنامه رفتار خود را تغییر میدهد و این طور به نظر می رسد که شی، کلاس خود را تغییر داده است. این تغییر با فراخوانی حالت های از پیش تعریف شده درون الگو اتفاق می افتد.
شاید درباره ی ماشینهایstate شنیده باشید. ماشینهای state معمولا با عملگرهای شرطی زیادی (مثل if یا switch) اجرا میشوند که با توجه به وضعیت فعلی شی، رفتار مناسب را انتخاب میکنند. روش الگوی طراحی state، روشی تمیزتر برای یک ماشین state میباشد که میتواند رفتار خود را در زمان اجرا تغییر دهد، بدون این که تبدیل به عبارت بزرگ شرطی شود.
در پترن State رفتار کلاس بر اساس وضعیت (State) داخلی آن تغییر میکند. با توجه به آرگومانی که به کلاس داده میشود، رفتار آن تغییر میکند (تغییر رفتار را در مثال زیر بیشتر درک خواهید کرد). برای درک بهتر به دیاگرام بالا توجه کنید، Context میتواند چندین وضعیت را داشته باشد. وقتی Request صدا زده شود درخواست به کمک State انجام میشود. State یک Interface بوده و ساختار کلی تمامی وضعیتها (State) را تعریف میکند. کلاس Concrete State یک پیاده سازی از State است و برای پاسخگویی و کنترل Request میباشد.
با تعاریف بالا (البته کمی گیج کننده بود!!) وقتی در Context یک وضعیت (State) تغییر کند کلاس Concrete State مخصوص آن صدا زده شده و اجرا میشود.