Decorator adalah design pattern struktural yang memungkinkan penambahan behaviour ke objek secara dinamis. Dengan menggunakan decorator, Anda dapat membungkus objek berkali-kali karena objek target dan decorator mengikuti antarmuka yang sama. Objek yang dihasilkan akan memiliki behaviour menumpuk dari wrapper.
Berikut contoh penggunaan decorator pada golang. Lihat baris comment untuk penjelasan code.
package main
import "fmt"
//component interface
type martabak interface {
getPrice() int
}
//concrete component
type rasaSpesial struct {
}
func (p *rasaSpesial) getPrice() int {
return 15000
}
//concrete decorator
type kacangTopping struct {
martabak martabak
}
func (c *kacangTopping) getPrice() int {
martabakPrice := c.martabak.getPrice()
return martabakPrice + 7000
}
//concrete decorator
type cheeseTopping struct {
martabak martabak
}
func (c *cheeseTopping) getPrice() int {
martabakPrice := c.martabak.getPrice()
return martabakPrice + 10000
}
func main() {
martabak := &rasaSpesial{}
//cheese topping
martabakWithCheese := &cheeseTopping{
martabak: martabak,
}
//kacang dan cheese topping
martabakWithCheeseAndKacang := &kacangTopping{
martabak: martabakWithCheese,
}
fmt.Printf("Harga Martabak special dengan topping kacang dan cheese adalah %d\n", martabakWithCheeseAndKacang.getPrice())
}
Harga Martabak special dengan topping tomato dan cheese adalah 32000