Strategy Pattern
Strategy (strategiya) naqshi
Xaritada bir joydan ikkinchisiga borishning bir necha yo'li bor: mashinada, piyoda, yoki jamoat transportida. Ilova sizga marshrutni ko'rsatishdan oldin, siz qaysi usulni tanlaganingizga qarab, hisoblash algoritmi o'zgaradi — lekin ilovaning qolgan qismi ("marshrutni ko'rsatish") bir xil ishlayveradi.
Strategy naqshi — aynan shu g'oya: bir vazifani bajarishning bir nechta almashtiriladigan usuli (algoritmi) bo'ladi, va ular hammasi bir xil interfeys ortida yashiringan. Bu — "Interface-Based Design" darsida ko'rgan g'oyaning, aynan algoritm tanlashga qaratilgan ko'rinishi.
package main
import "fmt"
type DiscountStrategy interface {
Apply(price float64) float64
}
type NoDiscount struct{}
func (NoDiscount) Apply(price float64) float64 { return price }
type PercentDiscount struct{ Percent float64 }
func (p PercentDiscount) Apply(price float64) float64 {
return price * (1 - p.Percent/100)
}
type Cart struct {
strategy DiscountStrategy
}
func (c *Cart) Checkout(price float64) float64 {
return c.strategy.Apply(price)
}
func main() {
cart := &Cart{strategy: PercentDiscount{Percent: 20}}
fmt.Println(cart.Checkout(100))
}Cart o'zi chegirma qanday hisoblanishini bilmaydi — u faqat DiscountStrategy interfeysiga (Apply metodiga) ishonadi. Agar bugun PercentDiscount (foizli chegirma), ertaga FixedAmountDiscount (qat'iy summa chegirmasi) yoki umuman chegirmasiz NoDiscount kerak bo'lsa — Cartning kodi o'zgarmaydi, faqat unga boshqa strategiya beriladi.
Strategy va Factory ko'pincha birgalikda ishlatiladi: Factory "qaysi strategiya kerakligini" (masalan foydalanuvchi turiga qarab) tanlaydi va yaratadi, Strategy esa tanlangan algoritmning o'zini bajaradi.
>_ Exercise
Yangi chegirma strategiyasini qo'shing.
- •FixedDiscount struct'i (Amount float64) yozing, Apply metodi bilan: price - Amount qaytarsin (manfiy bo'lib qolsa 0 qaytarsin)
- •Cart{strategy: FixedDiscount{Amount: 15}} yaratib, Checkout(100) natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Strategy naqshi almashtiriladigan algoritmlarni bitta interfeys ortida yashiradi — kontekst (masalan Cart) qaysi strategiya ishlatilayotganidan bexabar qoladi.
NEXT UP
Observer Pattern with Channels
$ go run main.go
Kodingizni ishga tushiring