در این قسمت تیم کدگیت را با آموزش Memento پترن در جاوا همراهی کنید. ابتدا این آموزش را با یادآوری Behavioral Design Pattern آغاز و در ادامه Memento پترن را توضیح میدهیم. در انتها، یک مثال را با استفاده از این پترن پیاده سازی خواهیم کرد. پیش نیاز این آموزش شامل موارد زیر است:
Behavioral Design Pattern
یکی از زیر شاخههای دیزاین پترن Behavioral Design Pattern میباشد. یکی از وظایف اصلی این دیزاین پترن، تعامل اشیا و جداسازی وظایف آنها با یکدیگر است. تعریف کامل Behavioral Design Pattern بدین صورت است که، تمامی اشیا با یکدیگر به راحتی بتوانند ارتباط برقرار کرده، بدون آنکه باعث وابستگی بین آنها شود.
Memento پترن در جاوا
Memento پترن زمانی استفاده میشود که بخواهیم وضعیت یک شی را ذخیره کنیم تا بتوانیم آن را به حالت قبل بازگردانیم. در دنیای واقعی این پترن مانند یک یادآور یا reference است برای اینکه یک چیز (شی) چگونه باید باشد. به عنوان مثال اگر تصمیم به جایگرینی قطعات یک تلفن را دارید شاید از یک تلفن از همان نوع به عنوان مرجع استفاده کنید تا مطمئن شوید تلفن شما دقیقا به حالت قبل برمیگردد.

مثال Memento پترن در جاوا
برای پیاده سازی پترن Memento به سه بازیگر نیاز داریم. در مثال این جلسه Memento، Originator و CareTaker کلاسهای ما هستند. کلاس Memento وضعیت شی را نگهداری میکند تا در صورت لزوم بازگردانی شود. کلاس Originator وظیفه ساخت شی و نگهداری آن با استفاده از کلاس Memento را دارد. در آخر وظیفه کلاس CareTaker، بازگردانی وضعیت قبلی به کمک کلاس Memento است. کد کلاسهای معرفی شده به صورت زیر میباشند:
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
در کلاس Orginator متد saveStateToMemento برای ذخیره وضعیت فعلی در Momento بوده و متد getStateFromMemento برای دریافت وضعیت ذخیره شده استفاده میشود.
تست مثال Memento پترن در جاوا
برای تست کدهای بالا، کد Main زیر را بزنید:
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
همانطور که در کد Main بالا میبینید با استفاده از کلاس Orginator چندین State (وضعیت) را ایجاد کرده و نام آنها را State #1 و …. قرار دادیم. بعضی از Stateها را در Memento ذخیره کرده و در آخر با استفاده از کلاس CareTaker وضعیتهای قبلی را بازگردانی کردیم.