1. State Pattern Nedir

Durum deseni, nesnenin farklı durumlarda farklı davranışlarını çözmek için kullanılan bir tür davranışsal tasarım desenidir. Nesnenin davranışını farklı durum sınıflarına kapsüller, iç durumundaki değişikliklere bağlı olarak nesnenin davranışını çalışma zamanında değiştirmesine izin verir.

2. Durum Deseninin Özellikleri ve Avantajları

Durum deseninin temel özellikleri ve avantajları aşağıdaki gibidir:

  • Karmaşık durum değerlendirme mantığını farklı durum sınıflarına kapsüller, kodun bakımını kolaylaştırır.
  • Açık/Kapalı Prensibi: Yeni durum sınıfları eklenerek kolayca yeni durumlar eklenebilir.
  • Her durum sınıfı birbirinden bağımsızdır, bir durum sınıfını değiştirmek diğer durum sınıflarının kodunu etkilemez.
  • Koşullu ifade mantığını basitleştirir, kodun okunabilirliğini ve ölçeklenebilirliğini artırır.

3. Durum Deseninin Pratik Uygulama Örnekleri

Durum deseninin trafik sinyal lambaları gibi gerçek hayatta birçok pratik uygulaması vardır:

  • Trafik sinyal lambaları: Farklı durumlara bağlı olarak trafik sinyal lambaları farklı ışık sinyalleri yayar.
  • Sipariş durumu yönetimi: Siparişler, ödenmiş, gönderilmiş ve alınmış gibi farklı durumlarda farklı işlemlere ve davranışlara sahiptir.

4. Golang'da Durum Deseninin Uygulanması

4.1 UML Sınıf Diyagramı

Golang'da Durum Deseni

4.2 Örnek Giriş

Bu örnekte basit bir sipariş durumu yönetim sistemi uygulayacağız. Siparişin ödenmiş, gönderilmiş ve alınmış gibi birden fazla durumu vardır. Farklı durumlara bağlı olarak siparişin farklı işlemlere ve davranışlara sahip olması.

4.3 Uygulama Durumu Gösterimi

4.3.1 Sipariş durumu arayüzünü ve somut durum sınıflarını tanımlayın

// Durum arayüzü
type State interface {
	Handle(context *Context)
}

// Somut Durum Sınıfı A
type ConcreteStateA struct {
	name string
}

func (c *ConcreteStateA) Handle(context *Context) {
	fmt.Println("Mevcut durum:", c.name)
	fmt.Println("Durum A için özel işlem gerçekleştiriliyor...")
context.SetState(&ConcreteStateB{name: "Somut durum B"})
}

// Somut Durum Sınıfı B
type ConcreteStateB struct {
	name string
}

func (c *ConcreteStateB) Handle(context *Context) {
	fmt.Println("Mevcut durum:", c.name)
	fmt.Println("Durum B için özel işlem gerçekleştiriliyor...")
context.SetState(&ConcreteStateA{name: "Somut durum A"})
}

4.3.2 Sipariş bağlam sınıfını ve durum geçiş yöntemlerini tanımlayın

// Bağlam sınıfı
type Context struct {
	state State
}

// Siparişi işle
func (c *Context) Handle() {
	c.state.Handle(c)
}

// Durumu ayarla
func (c *Context) SetState(state State) {
	c.state = state
}

4.3.3 Somut durum sınıfları için durum geçiş yöntemlerini uygulayın

// Somut durum sınıfı A için geçiş yöntemi
func (c *ConcreteStateA) SwitchStateB(context *Context) {
	context.SetState(&ConcreteStateB{name: "Somut durum B"})
}

// Somut durum sınıfı B için geçiş yöntemi
func (c *ConcreteStateB) SwitchStateA(context *Context) {
	context.SetState(&ConcreteStateA{name: "Somut durum A"})
}

4.3.4 Durum Deseni Kullanarak Sipariş Durumu Yönetimi

func main() {
	// Sipariş bağlamını başlat
	context := &Context{
		state: &ConcreteStateA{name: "Somut Durum A"},
	}

	// Siparişi işle
	context.Handle()

	// Durumu değiştir
	context.state.(*ConcreteStateA).SwitchStateB(context) // Somut Durum B'ye geç
	context.Handle()

	context.state.(*ConcreteStateB).SwitchStateA(context) // Somut Durum A'ya geri dön
	context.Handle()
}

Özet

Durum desenini kullanarak nesnelerin farklı durumlardaki davranışını daha iyi yönetebilir, kodun yeniden kullanılabilirliğini ve genişletilebilirliğini artırabiliriz. Bu öğreticide, Golang'u kullanarak basit bir sipariş yönetim sistemi kullanarak durum desenini nasıl uygulayabileceğimizi ve tam bir kod uygulaması ve UML sınıf diyagramını sağladık. Bu öğreticinin durum desenini daha iyi anlamanıza ve uygulamanıza yardımcı olabileceğini umuyoruz.