Hiç yanlışlıkla bir dosyanın içeriğini silip “Keşke geri alabilsem” dediğin oldu mu? Ya da bir oyun oynarken yanlış bir hamle yapıp “Önceki kayıttan devam etmeliyim” diye düşündün mü? İşte tam da bu gibi senaryolar için Memento Pattern (Hatıra Tasarım Kalıbı) devreye giriyor! 🔄
📌 Memento Pattern Nedir?
Memento Pattern, bir nesnenin önceki durumlarını kaydedip, gerektiğinde geri yüklemeye yarayan bir davranışsal tasarım desenidir. Kısacası, bir nesnenin geçmişini saklar ve istenildiğinde geri dönmesini sağlar.
Bu desen, özellikle şu durumlarda işe yarar:
- Undo (Geri Al) Mekanizmaları (Metin editörleri, oyunlar, grafik tasarım uygulamaları)
- Veri Kurtarma (Yanlış değişikliklerden geri dönmek için)
- Zaman Yolculuğu! ⏳ (Belirli bir tarihteki veriyi geri yükleme)
—
🎯 Memento Pattern Kullanmasaydık Ne Olurdu?
- Bir nesnenin önceki haline dönmek için manuel olarak bir sürü yedekleme kodu yazmak zorunda kalırdık.
- Kullanıcı bir hata yaptığında geri dönmek imkansız olurdu.
- Veri kaybı yaşanabilir ve geri alma işlemi çok daha karmaşık hale gelebilirdi.
Memento Pattern, durum yönetimini sistematik hale getirerek bu sorunları çözer! 🛠
—
🛠 Java ile Memento Pattern
Diyelim ki bir metin editörü yapıyoruz. Kullanıcı yazıyı düzenledikçe, her değişiklikten önce eski hali saklanıyor ve gerektiğinde geri alınabiliyor.
1️⃣ Memento (Hatıra) Sınıfı
Bu sınıf, nesnenin geçmiş durumunu saklar.
class Memento {
private final String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
2️⃣ Originator (Asıl Nesne)
Bu sınıf, nesnenin durumunu yönetir ve Memento nesneleri oluşturarak önceki halleri saklar.
class TextEditor {
private String text;
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
public Memento save() {
return new Memento(text);
}
public void restore(Memento memento) {
this.text = memento.getState();
}
}
3️⃣ Caretaker (Koruyucu Nesne)
Bu sınıf, Memento nesnelerini saklar ve gerektiğinde geri yükler.
import java.util.Stack;
class Caretaker {
private Stack<Memento> history = new Stack<>();
public void saveMemento(Memento memento) {
history.push(memento);
}
public Memento getLastSavedState() {
if (!history.isEmpty()) {
return history.pop();
}
return null;
}
}
4️⃣ Kullanım
public class Main {
public static void main(String[] args) {
TextEditor editor = new TextEditor();
Caretaker caretaker = new Caretaker();
editor.setText("İlk metin");
caretaker.saveMemento(editor.save());
editor.setText("İkinci metin");
caretaker.saveMemento(editor.save());
editor.setText("Üçüncü metin");
System.out.println("Güncel metin: " + editor.getText());
editor.restore(caretaker.getLastSavedState());
System.out.println("Geri alındı: " + editor.getText());
editor.restore(caretaker.getLastSavedState());
System.out.println("Bir kez daha geri alındı: " + editor.getText());
}
}
📌 Çıktı:
Güncel metin: Üçüncü metin
Geri alındı: İkinci metin
Bir kez daha geri alındı: İlk metin
Gördüğünüz gibi, kullanıcı istediği zaman önceki hallerine geri dönebiliyor. 🎯
—
🎮 Gerçek Dünya Senaryoları
1️⃣ Oyunlardaki Kayıt Mekanizması 🎮
- Oyuncuların ilerlemesini kaydedip, gerektiğinde eski bir kayıttan devam etmelerini sağlar.
2️⃣ Photoshop veya Word gibi uygulamalardaki Geri Al (Undo) İşlevi 🖌
- Yapılan değişiklikler saklanır ve gerektiğinde geri alınır.
3️⃣ Veri Tabanı Yedekleme Sistemleri 💾
- Veritabanı değişikliklerinden önce bir kopya saklanarak, sistem geri alınabilir hale getirilir.
4️⃣ Kod Editörlerindeki “Undo/Redo” Özelliği 💻
- Yazılımcılar için hayati önem taşıyan bu özellik, yapılan değişikliklerin geçmişini tutarak esneklik sağlar.
—
🚀 Sonuç: Geçmişi Koru, Hatalardan Korkma!
Memento Pattern, uygulamalara geri alma yeteneği kazandırarak kullanıcı deneyimini büyük ölçüde iyileştirir. Bir nesnenin geçmişini saklayarak, gerektiğinde eski haline dönebilmesini sağlar.
Eğer bir yazılımda geri alma (undo), yedekleme veya versiyon yönetimi gibi işlemler yapılıyorsa, Memento Pattern olmazsa olmazlardan biridir! 🔄