1. Gözlemci Tasarım Deseni Nedir
Gözlemci Tasarım Deseni, nesneler arasında birçok bağımlılık kurmak için kullanılan bir davranışsal tasarım desenidir. Özellikle, bir nesne (konuya veya gözlemlenebilire) değiştiğinde, tüm bağımlılıkları (gözlemciler olarak adlandırılır) otomatik olarak bilgilendirilir ve güncellenir. Bu desen, konular ve gözlemciler arasında gevşek bağlantıya izin verir, böylece nesneler arasında bağımsızlık ve esneklik elde edilir.
2. Gözlemci Tasarım Deseninin Özellikleri ve Avantajları
Gözlemci Tasarım Deseninin aşağıdaki özellikleri ve avantajları vardır:
- Konular ve gözlemciler arasında gevşek bağlantı, konunun gözlemcilerin belirli uygulama ayrıntılarını bilmesine gerek olmaması.
- Gözlemcilerin dinamik olarak eklenip çıkarılabilmesi, sistem daha esnek hale getirir.
- Konular ve gözlemciler arasında açık-kapalı prensibi takip edilerek, bağımsız genişletme ve yeniden kullanılabilirlik sağlanması.
- Bir konunun birden çok gözlemcisi olabilen birçoklu bağımlılık ilişkisi oluşturulabilmesi.
3. Gözlemci Tasarım Deseninin Pratik Uygulama Örnekleri
Gözlemci Tasarım Deseninin GUI arayüzlerindeki olay işleme mekanizması, gerçek zamanlı hisse senedi piyasa fiyatı güncellemeleri, e-ticaret platformlarındaki promosyon etkinliklerinin bildirimi gibi birçok gerçek hayattaki pratik uygulaması bulunmaktadır.
4. Gözlemci Tasarım Deseninin Golang'da Uygulanması
4.1 UML Sınıf Diyagramı
4.2 Örnek Tanımı
Bu örnekte, bir konu (Subject) ve iki gözlemci (ObserverA ve ObserverB) bulunmaktadır. Konu, gözlemcileri kaydetme, kayıttan kaldırma ve bildirimde bulunma yeteneklerine sahiptir.
4.3 Uygulama Adımları
4.3.1 Konu Arayüzü ve Somut Konu Sınıfı Oluşturma
type Subject interface {
RegisterObserver(observer Observer)
RemoveObserver(observer Observer)
NotifyObservers()
}
type ConcreteSubject struct {
observers []Observer
}
// Dinleyici nesnesi kaydı
func (subject *ConcreteSubject) RegisterObserver(observer Observer) {
subject.observers = append(subject.observers, observer)
}
// Dinleyici nesnesi kaldırma
func (subject *ConcreteSubject) RemoveObserver(observer Observer) {
for i, obs := range subject.observers {
if obs == observer {
subject.observers = append(subject.observers[:i], subject.observers[i+1:]...)
break
}
}
}
// Olay bildirimi tetikleme
func (subject *ConcreteSubject) NotifyObservers() {
for _, observer := range subject.observers {
observer.Update()
}
}
4.3.2 Gözlemci Arayüzü ve Somut Gözlemci Sınıfları Oluşturma
type Observer interface {
Update()
}
type ConcreteObserverA struct {}
func (observer *ConcreteObserverA) Update() {
fmt.Println("Gözlemci A bilgilendirildi.")
}
type ConcreteObserverB struct {}
func (observer *ConcreteObserverB) Update() {
fmt.Println("Gözlemci B bilgilendirildi.")
}
4.4 Örnek Kod Demosu
func main() {
subject := &ConcreteSubject{}
observerA := &ConcreteObserverA{}
observerB := &ConcreteObserverB{}
subject.RegisterObserver(observerA)
subject.RegisterObserver(observerB)
subject.NotifyObservers()
subject.RemoveObserver(observerA)
subject.NotifyObservers()
}
Çıktı:
Gözlemci A bilgilendirildi.
Gözlemci B bilgilendirildi.
Gözlemci B bilgilendirildi.
Yukarıdaki örnek kod, gözlemci deseni belirli bir uygulama örneğini göstermektedir. Konu (ConcreteSubject), iki gözlemci (ObserverA ve ObserverB) kaydetti ve ardından bu iki gözlemciye bildirimde bulundu. Daha sonra gözlemci A, konudan kaydedildi ve geriye kalan gözlemci B tekrar bildirildi.