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:
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.