1. Memento Deseni Nedir
Memento Deseni, bir nesnenin iç durumunu kaydetmek ve geri yüklemek için kullanılan bir davranışsal tasarım desenidir. Nesnenin durumunu, gelecekte nesneyi önceki bir duruma geri yüklemek için kullanılabilecek bir memento nesnesine kaydeder.
2. Memento Deseninin Özellikleri ve Avantajları
Memento Deseninin özellikleri ve avantajları şunları içerir:
- Kapsülleme prensibini ihlal etmeden bir nesnenin iç durumunu kaydedip geri yükleyebilir.
- Bir nesnenin geçmiş durumlarını esnek bir şekilde yönetebilir, geri al ve yeniden yap işlemlerini kolaylıkla gerçekleştirmeyi sağlar.
- Durumun dışarıya kaydedilmesine izin vererek nesnenin iç durumunun açığa çıkmasını engeller.
3. Memento Deseninin Pratik Uygulama Örnekleri
Memento Deseninin birçok pratik uygulama senaryosu bulunmaktadır. Bunlardan bazıları şunlardır:
- Metin düzenleyicilerde geri al ve yeniden yap özelliği, her işlemin durumunu kaydetmek için Memento Desenini kullanabilir.
- Oyunlarda kaydet ve yükle özelliği, oyun ilerlemesini kaydetmek için Memento Desenini kullanabilir.
- E-posta istemcilerinde taslak depolama özelliği, taslak e-postaların durumunu kaydetmek için Memento Desenini kullanabilir.
4. Memento Deseninin Golang'da Uygulanması
4.1. UML Sınıf Diyagramı
4.2. Örnek Tanıtımı
UML Sınıf Diyagramına Dayalı Açıklama
Bu örnekte, iç durumu "durum" olarak adlandırılan bir Originator sınıfımız var. Originator, SetState yöntemini kullanarak durumu ayarlar ve CreateMemento yöntemini kullanarak bir memento nesnesi oluşturur. Memento nesnesinin iç durumu, Originator ile aynıdır. Caretaker sınıfı, memento nesnesini depolamaktan ve AddMemento yöntemi ile mementolar eklemekten sorumludur.
Uygulama Adımları
- Originator'da durumu kaydetmek için GetState yöntemi olan Memento nesnesi oluşturun.
- Durumu ayarlamak ve bir memento oluşturmak için yöntemlere sahip Originator nesnesi oluşturun.
- Memento nesnesini kaydetmekten sorumlu olan Caretaker nesnesi oluşturun.
- Originator'da bir memento oluşturmak ve durumu geri yüklemek için yöntemleri uygulayın: - Bir memento nesnesi oluşturulduğunda, Originator'un durumunu memento içinde kaydedin. - Durumu geri yüklerken, durumu mementodan Originator'a geri yükleyin.
- Caretaker'da bir memento eklemek ve bir memento almak için yöntemleri uygulayın: - Memento eklemek için add memento yöntemi, memento nesnesini Caretaker içinde kaydetmek için kullanılır. - Memento almak için get memento yöntemi, memento nesnesini Caretaker'dan almak için kullanılır.
4.3.1. Memento Nesnesi Oluşturma
type Memento struct {
state string
}
func (m *Memento) GetState() string {
return m.state
}
4.3.2. Durumu Memento'da Saklama
type Originator struct {
state string
}
func (o *Originator) SetState(state string) {
o.state = state
}
func (o *Originator) CreateMemento() *Memento {
return &Memento{state: o.state}
}
4.3.3. Durumu Mementodan Geri Yükleme
func (o *Originator) SetMemento(memento *Memento) {
o.state = memento.GetState()
}
4.3.4. Geri Al işlemleri için Memento Deseninin Kullanımı
type Caretaker struct {
mementos []*Memento
}
func (c *Caretaker) AddMemento(m *Memento) {
c.mementos = append(c.mementos, m)
}
func (c *Caretaker) GetMemento(index int) *Memento {
return c.mementos[index]
}
4.3.5. Yeniden Yap İşlemleri için Memento Deseni Kullanımı
func main() {
originator := &Originator{}
caretaker := &Caretaker{}
originator.SetState("Durum 1")
caretaker.AddMemento(originator.CreateMemento())
originator.SetState("Durum 2")
caretaker.AddMemento(originator.CreateMemento())
originator.SetMemento(caretaker.GetMemento(0))
fmt.Println("Durum 1'e geri yüklendikten sonra originator durumu:", originator.state)
originator.SetMemento(caretaker.GetMemento(1))
fmt.Println("Durum 2'ye geri yüklendikten sonra originator durumu:", originator.state)
}