1. Mediator Pattern Nedir

Mediator Pattern, nesneler arasındaki iletişimi bir aracı nesneye aktararak doğrudan bağımlılıkları azaltan davranışsal bir tasarım desenidir. Mediator Pattern'de nesneler artık doğrudan birbirleriyle iletişim kurmaz, bunun yerine aracı nesne aracılığıyla iletişim kurarlar.

2. Mediator Pattern'ın Özellikleri ve Avantajları

Mediator Pattern'ın özellikleri ve avantajları aşağıdaki gibidir:

  • Nesneler arasındaki doğrudan bağlantıyı azaltarak sistem karmaşıklığını azaltır.
  • Aracı bir nesne iletişimi yöneterek nesneler arasındaki iletişimi basitleştirir.
  • Nesneler arasındaki etkileşim kontrolünü merkezileştirerek genişletme ve bakımı kolaylaştırır.

3. Mediator Pattern'ın Gerçek Dünya Örnekleri

Mediator Pattern'ın gerçek hayatta birçok uygulaması bulunmaktadır. Örneğin, bir havalimanı planlama sisteminde, görevli aracı olarak hareket ederken farklı modüller; uçaklar ve yer trafiği, aracı ile iletişim kurar ve koordine olur.

4. Golang'da Mediator Pattern'ın Uygulanması

4.1 UML Sınıf Diyagramına Giriş

Aşağıda Golang'da Mediator Pattern için UML sınıf diyagramı bulunmaktadır:

Golang'da Mediator Pattern

4.2 Örnek Girişi

Bu örnekte, farklı kullanıcılar arasındaki iletişimi yönetmek için Mediator Pattern'ı kullanarak basit bir sohbet odası uygulaması uygulayacağız.

4.3 Uygulama Adımı 1: Aracı Arayüzünü ve Somut Aracıyı Tanımlama

Öncelikle, bir aracı arayüzü ve somut bir aracı sınıfı tanımlıyoruz:

type Mediator interface {
    registerColleague(colleague Colleague)
    sendMessage(message string, colleague Colleague)
}

type ConcreteMediator struct {
    colleagues map[string]Colleague
}

func (m *ConcreteMediator) registerColleague(colleague Colleague) {
    m.colleagues[colleague.getName()] = colleague
}

func (m *ConcreteMediator) sendMessage(message string, colleague Colleague) {
    for _, c := range m.colleagues {
        if c != colleague {
            c.receiveMessage(message)
        }
    }
}

4.4 Uygulama Adımı 2: Eş Çalışan Arayüzünü ve Somut Eş Çalışanı Tanımlama

Daha sonra, eş çalışan bir arayüz ve somut eş çalışan sınıflarını tanımlıyoruz:

type Colleague interface {
    receiveMessage(message string)
    sendMessage(message string)
    getName() string
}

type ConcreteColleagueA struct {
    mediator Mediator
    name     string
}

func (c *ConcreteColleagueA) receiveMessage(message string) {
    fmt.Printf("%s mesajı aldı: %s\n", c.name, message)
}

func (c *ConcreteColleagueA) sendMessage(message string) {
    c.mediator.sendMessage(message, c)
}

func (c *ConcreteColleagueA) getName() string {
    return c.name
}

type ConcreteColleagueB struct {
    mediator Mediator
    name     string
}

func (c *ConcreteColleagueB) receiveMessage(message string) {
    fmt.Printf("%s mesajı aldı: %s\n", c.name, message)
}

func (c *ConcreteColleagueB) sendMessage(message string) {
    c.mediator.sendMessage(message, c)
}

func (c *ConcreteColleagueB) getName() string {
    return c.name
}

4.5 Uygulama Adımı 3: Eş Çalışanları Aracı İle Yönetme

Belirli aracı sınıfta, meslektaş sınıflar arasındaki iletişimi yönetmek için registerColleague yöntemini ve sendMessage yöntemini uygulamamız gerekmektedir:

func main() {
    mediator := &ConcreteMediator{
        colleagues: make(map[string]Colleague),
    }

    colleagueA := &ConcreteColleagueA{
        mediator: mediator,
        name:     "Meslektaş A",
    }
    colleagueB := &ConcreteColleagueB{
        mediator: mediator,
        name:     "Meslektaş B",
    }

    mediator.registerColleague(colleagueA)
    mediator.registerColleague(colleagueB)

    colleagueA.sendMessage("Merhaba Dünya!")
    colleagueB.sendMessage("Selam!")
}

main fonksiyonunda, belirli bir aracı nesne ve iki belirli meslektaş nesne oluşturuyoruz. Daha sonra meslektaş nesnelerini aracı nesne üzerinden kaydettikten ve iletişim testini gerçekleştirdik.