Observer adalah behavioral design pattern yang memungkin sebuah object untuk melakukan notifikasi perubahan state terhadap object lain.
Contoh kasus, pada web e-commerce, items terjual dari stock setiap waktu. Ada kemungkinan customer mengalami kehabisan stock. Pendekatan observer memungkinkan customer mendapatkan notifikasi jika suatu produk yang diinginkan ready stock.
Komponen utama dari observer pattern adalah:
- Subject, instance yang mempublish event.
- Observer, yang men-subscribes subject events dan mendapatkan notifikasi ketika event tersebut terjadi.
Berikut contoh implementasi patter observer dalam golang.
package main import "fmt" //subject type subject interface { register(Observer observer) deregister(Observer observer) notifyAll() } //concrete subject type item struct { observerList []observer name string inStock bool } func newItem(name string) *item { return &item{ name: name, } } func (i *item) updateAvailability() { fmt.Printf("Item %s ready stock\n", i.name) i.inStock = true i.notifyAll() } func (i *item) register(o observer) { i.observerList = append(i.observerList, o) } func (i *item) deregister(o observer) { i.observerList = removeFromslice(i.observerList, o) } func (i *item) notifyAll() { for _, observer := range i.observerList { observer.update(i.name) } } func removeFromslice(observerList []observer, observerToRemove observer) []observer { observerListLength := len(observerList) for i, observer := range observerList { if observerToRemove.getID() == observer.getID() { observerList[observerListLength-1], observerList[i] = observerList[i], observerList[observerListLength-1] return observerList[:observerListLength-1] } } return observerList } //observer type observer interface { update(string) getID() string } //concrete observer type customer struct { id string } func (c *customer) update(itemName string) { fmt.Printf("mengirim email ke customer %s untuk item %s\n", c.id, itemName) } func (c *customer) getID() string { return c.id } func main() { shirtItem := newItem("Sepatu Bola") observerFirst := &customer{id: "abc@gmail.com"} observerSecond := &customer{id: "xyz@gmail.com"} shirtItem.register(observerFirst) shirtItem.register(observerSecond) shirtItem.updateAvailability() }
Item Sepatu Bola ready stock
mengirim email ke customer abc@gmail.com untuk item Sepatu Bola
mengirim email ke customer xyz@gmail.com untuk item Sepatu Bola
Kesimpulan
Dengan memahami pattern design dapat membuat code Anda lebih mudah dipelihara dan dikembangkan. Selain itu sesuai dengan standar yang dilakukan oleh profesional software engineer.
Tutorial ini hanya membahas beberapa pattern yang popular, silakan melakukan studi lanjut untuk mendalamin pattern lainnya.
Dengan berakhirnya modul ini, tutorial pattern dalam bahasa Go sudah selesai. Semoga bermanfaat.