GoDasturchi
Strategy Pattern

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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