Golang: The Decorator Pattern in Boba Shop

Siapa yang tak kenal minuman Boba ?
Bahkan banyak merk boba dibuat franchise dan sudah menjamur di kota-kota besar. Saya pun ada cerita menarik ketika saya berhenti di suatu kedai boba dan hendak membelinya. Saya kebingungan ketika melihat daftar menu yang tertera, disana tertulis varian rasa boba dan juga varian topping nya.
Namun setelah saya memutuskan membeli 2 item dengan rasa yang sama dan topping yg berbeda, saya malah kepikiran konsep order boba nya sendiri dalam programming.
Boba yang saya pesan dengan varian rasa sama, tetapi dengan topping yang berbeda membuat perbedaan harga di keduanya. Saya berpikir, Boba itu sebagai object-nya dan topping sebagai komponen-komponen pendukungnya. Boba sendiri mempunyai harga, pun juga untuk topping sendiri memiliki harga masing-masing.
Mengapa dibuat terpisah antara boba dan topping nya ? Tidak kah lebih simple dibuat boba + topping A dan boba + topping B. Saya pun menyadari, topping disini hanya sebuah komponen tambahan yang dinamis, bisa menambahkan lebih dari 1 topping dalam sebuah pesanan boba, sehingga di dalam menu dibuat terpisah agar lebih simple ketika datang pesanan. Menarik!
Konsep diatas dalam dunia programming di istilahkan dengan Decorator Pattern. Sebuah pattern yang memberikan cara yang dinamis untuk menambahkan dan meng-override perilaku dari method yang sudah ada di dalam sebuah object.
Mari kita simak dalam studi kasus di bahasa pemrograman Golang.

Saya membuat kelas Boba nya sendiri yang dalam bahasa pemograman Go bisa kita manipulasi dengan struct. Pertama saya mendeklarasikan sebuah interface bernama bobaInterface yang memiliki method GetPrice() di dalamnya.
Kemudian membuat struct
boba yang memiliki price sebagai entitas nya. func NewBoba()
yang akan mengembalikan nilai pointer dari si struct
boba merupakan function utk inisialisasi object boba nya sendiri.
Kemudian GetPrice()
sebagai implementasi dari interface
diatas yang akan mengembalikan harga boba tersebut.

Kemudian saya membuat file bernama topping.go
untuk mendeklarasikan setiap topping sebagai komponen boba tadi. Disini saya mendeklarasikan beberapa topping dengan harga yang berbeda-beda.

Adapun saya membuat struct dari masing-masing topping tersebut yang memiliki boba Interface
sebagai entitas di dalamnya.
Nah, sampai disini semua persiapan sudah selesai tinggal bagaimana meng-override object boba sendiri dengan topping yang dinamis.

Kemudian di dalam topping.go
kita override method GetPrice()
sesuai topping masing-masing. Kemudian kembalikan harga boba itu sendiri ditambah harga topping yang ada di dalam constant variable yang sudah kita tulis diatas.

Di dalam file main.go
kita mencoba 2 kasus yaitu pesanan boba + topping ice cream dan boba + mousse + coffee jelly.
Saya mendeklarasikan IceCreamBoba
yang entitas boba di isi dengan NewBoba()
sedangkan MousseCoffeJellyBoba
di isi dengan struct MousseBoba
yang di dalamnya terdapat CoffeJellyBoba
.
Maka kita medapatkan 2 item boba + topping yang berbeda dengan harga yang berbeda pula.

Boba + Ice Cream dengan harga 153000
Boba + Mousse + Coffee Jelly dengan harga 155000
Menarik bukan ? sebuah konsep yang dinamis namun simple seperti konsep pesanan boba pada salah satu kedai boba yang saya kunjungi.
Terima kasih.
Artikel Sebelumnya :