1. Strateji Deseni Nedir
Strateji deseni, farklı durumlara bağlı olarak farklı algoritmaları veya davranışları seçmemizi sağlayan davranışsal bir tasarım desenidir. Farklı algoritmaları ayrı strateji sınıflarında kapsüller ve bu strateji sınıflarının değiştirilebilir olmasına izin verir. Strateji desenini kullanarak nesnenin yapısını doğrudan değiştirmeden çalışma zamanında nesnenin davranışını dinamik olarak değiştirebiliriz.
2. Strateji Deseninin Karakteristikleri ve Avantajları
Strateji deseninin aşağıdaki karakteristikleri ve avantajları bulunmaktadır:
- Strateji sınıfı bağımsız olarak değiştirilebilir, yeni bir strateji sınıfı eklemek orijinal kodu etkilemez, açık-kapalı prensibe uyar.
- Müşteriler ihtiyaca göre farklı stratejiler seçebilir, tek sorumluluk ilkesine uyar.
- Strateji deseni tekrar kullanılabilir algoritmalar veya davranışlar sağlayarak kod tekrarını önler.
- Strateji deseni, kodu daha iyi organize etmenin, kodu daha anlaşılır ve bakımını daha kolay hale getiren daha iyi bir yol sağlar.
3. Strateji Deseninin Pratik Uygulama Örnekleri
Strateji deseni aşağıdaki senaryolarda yaygın olarak kullanılır:
- Alipay, WeChat Pay vb. farklı ödeme yöntemleri.
- Kabarcık sıralaması, hızlı sıralama vb. farklı sıralama algoritmaları.
- Konsol çıktısı, dosya çıktısı vb. farklı günlükleme yöntemleri.
4. Golang'da Strateji Deseninin Uygulanması
Bu bölümde, Golang kullanarak strateji desenini uygulayacak ve buna uygun örnekler, UML sınıf diyagramları ve kod yorumları sağlayacağız.
4.1. UML Sınıf Diyagramı
Aşağıda Golang'da strateji deseninin UML sınıf diyagramı bulunmaktadır:
4.2. Örnek Tanıtımı
Yukarıdaki UML sınıf diyagramından, strateji deseninin üç rolünü görebiliriz: Strategy
arayüzü, somut strateji sınıfları (örneğin ConcreteStrategyA
ve ConcreteStrategyB
) ve bağlam sınıfı Context
.
Bu örnekte, e-ticaret sistemi siparişlerinde ödeme yöntemlerinin seçilmesini açıklama olarak kullanacağız. Müşteri, ödeme yöntemine bağlı olarak ilgili stratejiyi (ConcreteStrategyA
veya ConcreteStrategyB
) seçer ve daha sonra ödeme yapmak için bağlam sınıfının yöntemini çağırır.
4.3. Uygulama Adımı 1: Strateji Arayüzünü ve Somut Strateji Sınıflarını Tanımlamak
İlk olarak, belirli bir stratejiyi yürütmek için Execute(data interface{}) string
yöntemini içeren bir strateji arayüzü Strategy
tanımlamamız gerekmektedir.
type Strategy interface {
Execute(data interface{}) string
}
type ConcreteStrategyA struct{}
func (s *ConcreteStrategyA) Execute(data interface{}) string {
// Belirli strateji A'yı yürütmek için mantık
}
type ConcreteStrategyB struct{}
func (s *ConcreteStrategyB) Execute(data interface{}) string {
// Belirli strateji B'yi yürütmek için mantık
}
4.4. Uygulama Adımı 2: Bağlam Sınıfını Uygulamak
Daha sonra, belirli bir strateji nesnesini kapsülleyen ve strateji nesnesini ayarlamak için SetStrategy(strategy Strategy)
yöntemini sağlayan, ayrıca belirli stratejiyi yürütmek için ExecuteStrategy(data interface{}) string
yöntemini sağlayan Context
sınıfını uygulamamız gerekmektedir.
type Context struct {
strategy Strategy
}
func (c *Context) SetStrategy(strategy Strategy) {
c.strategy = strategy
}
func (c *Context) ExecuteStrategy(data interface{}) string {
if c.strategy == nil {
// Varsayılan strateji yürütme mantığı
} else {
return c.strategy.Execute(data)
}
}
4.5. Uygulama Adımı 3: Strateji Desenini Kullanarak Gerçek İş Mantığını Tamamlamak
Son olarak, istemci tarafında strateji desenini kullanarak gerçek iş mantığını tamamlayabiliriz.
func main() {
context := &Context{}
// SetStrategy yöntemini kullanarak belirli strateji A'yı ayarlayın
context.SetStrategy(&ConcreteStrategyA{})
result := context.ExecuteStrategy("Alipay ödemesi")
// SetStrategy yöntemini kullanarak belirli strateji B'yi ayarlayın
context.SetStrategy(&ConcreteStrategyB{})
result = context.ExecuteStrategy("WeChat ödemesi")
}
Sonuç
Yukarıdaki örnek kod aracılığıyla, Golang'da strateji desenini nasıl uygulayacağımızı öğrendik. Strateji deseni, farklı durumlara bağlı olarak farklı algoritmaları veya davranışları seçmemize yardımcı olur ve kodu daha iyi organize etmenin, daha anlaşılır ve bakımını daha kolay hale getiren bir yol sağlar. Pratikte, strateji desenini makul bir şekilde kullanmak, kodun ölçeklenebilirliğini ve bakımını etkili bir şekilde artırabilir.