Behavior Design Pattern: Observer

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.

Sharing is caring:

Leave a Comment