در این قسمت تیم کدگیت را با آموزش State پترن در جاوا همراهی کنید. در ابتدا State پترن را معرفی کرده سپس به کمک رسم دیاگرام، کاربرد آن را توضیح مختصری میدهیم. در انتها یک مثال واقعی با هدف معرفی State پترن پیاده سازی خواهیم کرد. پیشنهاد میشود قبل از مطالعه این جلسه، آموزشهای زیر را بررسی کنید:
Behavioral Design Pattern
یکی از زیر شاخههای دیزاین پترن Behavioral Design Pattern میباشد. یکی از وظایف اصلی این دیزاین پترن، تعامل اشیا و جداسازی وظایف آنها با یکدیگر است. تعریف کامل Behavioral Design Pattern بدین صورت است که، تمامی اشیا با یکدیگر به راحتی بتوانند ارتباط برقرار کرده، بدون آنکه باعث وابستگی بین آنها شود.
State پترن در جاوا
در پترن State رفتار کلاس بر اساس وضعیت (State) داخلی آن تغییر میکند. با توجه به آرگومانی که به کلاس داده میشود، رفتار آن تغییر میکند (تغییر رفتار را در مثال زیر بیشتر درک خواهید کرد). برای درک بهتر به دیاگرام بالا توجه کنید، Context میتواند چندین وضعیت را داشته باشد. وقتی Request صدا زده شود درخواست به کمک State انجام میشود. State یک Interface بوده و ساختار کلی تمامی وضعیتها (State) را تعریف میکند. کلاس Concrete State یک پیاده سازی از State است و برای پاسخگویی و کنترل Request میباشد.
با تعاریف بالا (البته کمی گیج کننده بود!!) وقتی در Context یک وضعیت (State) تغییر کند کلاس Concrete State مخصوص آن صدا زده شده و اجرا میشود.
مثال State پترن در جاوا
در مثال State پترن در جاوا ما یک تلویزیون را در نظر گرفتیم. دو وضعیت On و Off را برای این مثال تعریف کردهایم. حال با تعاریف داده شده Interface را به نام State به صورت زیر تعریف کردهایم:
public interface State {
public void doAction();
}
دو کلاس TVStartState و TVStopState به صورت زیر پیاده سازی کردیم(دقت کنید به دیاگرام Concrete کلاس ها):
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV is turned OFF");
}
}
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV is turned ON");
}
}
در کلاس Context ما State های خود را تنظیم میکنیم. کد این کلاس به صورت زیر است:
public class TVContext implements State {
private State tvState;
public void setState(State state) {
this.tvState = state;
}
public State getState() {
return this.tvState;
}
@Override
public void doAction() {
this.tvState.doAction();
}
}
تست مثال State پترن در جاوا
برای تست کدهای بالا، کد Main زیر را بنویسید:
public static void main(String[] args) {
TVContext context = new TVContext();
State tvStartState = new TVStartState();
State tvStopState = new TVStopState();
context.setState(tvStartState);
context.doAction();
context.setState(tvStopState);
context.doAction();
}
خروجی کدهای بالا در زیر مشاهده میکنید:
TV is turned ON
TV is turned OFF