Decorator Pattern
Decorator (bezovchi) naqshi
"Middleware: Logging and Chaining" darsida siz allaqachon bu naqshni ko'rgansiz, garchi u alohida nom bilan tanishtirilmagan bo'lsa ham! Decorator — bir funksiya yoki obyektni o'rab, uning asl xatti-harakatini o'zgartirmasdan, ustiga qo'shimcha imkoniyat qo'shish naqshi.
Buni sovg'a qutisiga o'xshating: ichidagi sovg'aning o'zi o'zgarmaydi, lekin uni chiroyli qog'ozga o'rab, bant bog'lab, karta qo'shib — "bezaysiz". Har bir qatlam avvalgisini butunlay saqlab qoladi, ustiga faqat bir narsa qo'shadi.
package main
import "fmt"
type Handler func(msg string) string
func withUpperCase(next Handler) Handler {
return func(msg string) string {
result := next(msg)
upper := ""
for _, ch := range result {
if ch >= 'a' && ch <= 'z' {
ch = ch - 'a' + 'A'
}
upper += string(ch)
}
return upper
}
}
func withExclaim(next Handler) Handler {
return func(msg string) string {
return next(msg) + "!"
}
}
func base(msg string) string {
return "salom, " + msg
}
func main() {
handler := withUpperCase(withExclaim(base))
fmt.Println(handler("dunyo"))
}base — eng ichkarida turgan, asl funksiya. withExclaim(base) uni o'rab, oxiriga "!" qo'shadigan yangi funksiya yasaydi. withUpperCase(...) esa BUNI ham o'rab, natijani katta harflarga o'tkazadi. Chaqiruv tartibi "ichkaridan tashqariga": avval base ishlaydi ("salom, dunyo"), keyin withExclaim ("salom, dunyo!"), va eng oxirida withUpperCase ("SALOM, DUNYO!").
Bu naqshning kuchi — har bir "bezak qatlami" mustaqil va qayta ishlatiladigan: withUpperCaseni istalgan boshqa Handler bilan ham, istalgan tartibda ham ishlatish mumkin. Bu — HTTP middleware'lardan tortib, log yozish, keshlash, xavfsizlik tekshiruvlarigacha ko'plab joyda ishlatiladigan universal naqsh.
>_ Exercise
Yangi bezak qatlamini qo'shing.
- •withPrefix(prefix string, next Handler) Handler yozing: natija oldiga prefix qo'shsin
- •handler := withPrefix(">> ", base) yasang
- •handler("Dunyo") natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Decorator — funksiya yoki obyektni o'rab, asl xatti-harakatni saqlagan holda ustiga qo'shimcha imkoniyat qo'shadi; qatlamlarni istalgan tartibda birlashtirish mumkin.
NEXT UP
Table-Driven Tests
$ go run main.go
Kodingizni ishga tushiring