GoDasturchi
Decorator Pattern

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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