Memento Pattern একটি বিহেভিয়রাল ডিজাইন প্যাটার্ন, যা একটি অবজেক্টের অভ্যন্তরীণ অবস্থানকে সংরক্ষণ করে এবং সেই অবস্থাকে পরে পুনরুদ্ধার করার সুযোগ দেয়। এটি মূলত অবজেক্টের ইতিহাস ট্র্যাক করার জন্য ব্যবহৃত হয়, যেমন একটি অবজেক্টের স্থিতি (state) পুনরুদ্ধারের প্রয়োজন হলে, আপনি সেই স্থিতিকে রিস্টোর করতে পারেন।
Memento Pattern মূলত তিনটি উপাদান নিয়ে কাজ করে:
- Originator: এটি এমন একটি অবজেক্ট যার অবস্থা (state) সংরক্ষণ করা এবং পুনরুদ্ধার করা হয়।
- Memento: এটি অবজেক্টের একটি কপি যা অবজেক্টের বর্তমান অবস্থাকে ধারণ করে।
- Caretaker: এটি মেমেন্টো অবজেক্টটি সংরক্ষণ করে এবং মূল অবজেক্টের অবস্থান পরিবর্তন করতে সাহায্য করে।
Memento Pattern এর প্রয়োজনীয়তা
যখন কোনো অবজেক্টের অবস্থান বারবার পরিবর্তিত হয় এবং আপনি সেই অবস্থা রক্ষা করতে চান, কিন্তু এটি অবজেক্টের অভ্যন্তরীণ প্রাইভেট ডেটা না জানিয়ে তা করতে চান, তখন Memento Pattern ব্যবহার করা হয়। এটি কার্যকরীভাবে "undo" বা "rollback" ফিচার তৈরি করতে সাহায্য করে।
Memento Pattern এর কাঠামো
- Originator: অবজেক্টের মধ্যে ডেটা বা স্টেট সংরক্ষণ করা হয়।
- Memento: অবজেক্টের স্টেট বা অবস্থার কপি।
- Caretaker: স্টেট বা অবস্থাটি পরিচালনা ও সংরক্ষণ করে।
উদাহরণ: Memento Pattern
ধরা যাক, আমরা একটি TextEditor (টেক্সট এডিটর) তৈরি করছি, যেখানে ব্যবহারকারী টেক্সট লিখছে এবং তার পর সেই টেক্সটের পূর্ববর্তী অবস্থায় ফিরে যেতে পারবে।
1. Originator Class (TextEditor)
TextEditor হল সেই ক্লাস যা তার অবস্থা (যেমন টেক্সট) সংরক্ষণ করে এবং পুনরুদ্ধার করতে সাহায্য করে।
public class TextEditor {
private String text;
public TextEditor(String text) {
this.text = text;
}
// Method to set text
public void setText(String text) {
this.text = text;
}
// Method to get text
public String getText() {
return text;
}
// Method to create a Memento (save state)
public Memento save() {
return new Memento(text);
}
// Method to restore state from Memento
public void restore(Memento memento) {
this.text = memento.getSavedState();
}
}
2. Memento Class
Memento ক্লাস অবজেক্টের অবস্থা সংরক্ষণ করে। এটি মূল অবজেক্টের অভ্যন্তরীণ তথ্য ধারণ করে।
public class Memento {
private final String savedState;
// Constructor to save state
public Memento(String state) {
this.savedState = state;
}
// Getter for saved state
public String getSavedState() {
return savedState;
}
}
3. Caretaker Class
Caretaker ক্লাস একটি বা একাধিক মেমেন্টো সংরক্ষণ করে। এটি মেমেন্টো অবজেক্টের সাথে সম্পর্কিত নয়, বরং শুধু সংরক্ষণ এবং পুনরুদ্ধারের দায়িত্ব পালন করে।
import java.util.Stack;
public class Caretaker {
private Stack<Memento> mementoList = new Stack<>();
// Method to add Memento to the list
public void addMemento(Memento memento) {
mementoList.push(memento);
}
// Method to get the last saved Memento
public Memento getLastMemento() {
if (!mementoList.isEmpty()) {
return mementoList.pop();
}
return null;
}
}
4. Testing the Memento Pattern
এখন আমরা সবকটি ক্লাস ব্যবহার করে একটি উদাহরণ দেখব যেখানে টেক্সট এডিটর একটি টেক্সট স্টেট সেভ করে এবং পরে সেই স্টেট পুনরুদ্ধার করবে।
public class MementoPatternExample {
public static void main(String[] args) {
// Create a TextEditor and set initial text
TextEditor editor = new TextEditor("Hello");
System.out.println("Initial Text: " + editor.getText());
// Create a Caretaker to manage mementos
Caretaker caretaker = new Caretaker();
// Save the state
caretaker.addMemento(editor.save());
editor.setText("Hello, world!");
System.out.println("Updated Text: " + editor.getText());
// Restore the state
editor.restore(caretaker.getLastMemento());
System.out.println("Restored Text: " + editor.getText());
}
}
আউটপুট:
Initial Text: Hello
Updated Text: Hello, world!
Restored Text: Hello
এখানে:
- প্রথমে আমরা
TextEditorতৈরি করেছি এবং সেটির প্রথম টেক্সট"Hello"সেট করেছি। - তারপর আমরা
Caretakerদিয়ে সেই স্টেট সেভ করেছি। - এরপর আমরা টেক্সট পরিবর্তন করেছি, কিন্তু তারপর আগের টেক্সট
"Hello"-তে ফিরে এসেছি, যাrestore()মেথডের মাধ্যমে সম্ভব হয়েছে।
Memento Pattern এর ব্যাখ্যা:
- TextEditor (Originator): এটি আসল অবজেক্ট যার স্টেট (অর্থাৎ টেক্সট) সংরক্ষণ করা এবং পুনরুদ্ধার করা হয়।
- Memento: এটি
TextEditorএর বর্তমান অবস্থা (টেক্সট) সংরক্ষণ করে এবং কোনো অন্য ক্লাসে পাঠানো বা পুনরুদ্ধার করা যায়। - Caretaker: এটি
Mementoসংরক্ষণ করে এবং পরে সেইMementoথেকে অবস্থা পুনরুদ্ধার করতে সাহায্য করে।CaretakerকখনোMementoক্লাসের ভিতরের স্টেট জানে না।
Advantages of Memento Pattern:
- Encapsulation of State: Memento Pattern অবজেক্টের অভ্যন্তরীণ অবস্থাকে সুরক্ষিত রাখে এবং শুধুমাত্র প্রয়োজনীয় অংশকেই অ্যাক্সেস করার সুযোগ দেয়।
- Undo/Redo Functionality: এটি "undo" বা "redo" অপশন তৈরি করতে সহায়ক, কারণ পূর্ববর্তী অবস্থায় ফিরে যাওয়ার জন্য আমরা সহজেই অবজেক্টের পুরানো স্টেট ব্যবহার করতে পারি।
- Separation of Concerns:
Caretakerঅবজেক্টটি শুধুমাত্র মেমেন্টো সংরক্ষণ এবং পুনরুদ্ধারের কাজ করে, যা মূল অবজেক্ট (Originator) থেকে আলাদা। এটি কোডের পরিষ্কারতা ও রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি করে।
Disadvantages:
- Memory Consumption: মেমেন্টো ক্লাসটি অবজেক্টের একটি কপি সংরক্ষণ করে, যা অতিরিক্ত মেমরি ব্যবহার করতে পারে, বিশেষত যখন বড় বা জটিল অবজেক্টের অবস্থান সংরক্ষণ করতে হয়।
- Complexity: অনেক সময় এটি অতিরিক্ত কোড তৈরি করে, কারণ একাধিক মেমেন্টো অবজেক্ট তৈরি হতে পারে এবং সেগুলি সংরক্ষণ ও পুনরুদ্ধার করতে অনেক কোডের প্রয়োজন হতে পারে।
সারাংশ
Memento Pattern একটি শক্তিশালী ডিজাইন প্যাটার্ন যা অবজেক্টের স্টেট সংরক্ষণ এবং পরে পুনরুদ্ধারের কাজ করে। এটি মূলত undo/redo ফিচারের জন্য ব্যবহৃত হয় এবং অবজেক্টের অভ্যন্তরীণ অবস্থা সংরক্ষণে সহায়তা করে। Originator অবজেক্ট, Memento ক্লাস এবং Caretaker ক্লাসের সাহায্যে, আমরা অবজেক্টের অভ্যন্তরীণ অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করতে পারি। Memento Pattern এফেক্টিভভাবে স্টেট ম্যানেজমেন্ট, গেমস, ডেটা রিকভারি এবং অন্যান্য সিস্টেমের জন্য ব্যবহার করা যায়।
Read more