Mediator Tasarım Deseni

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda tasarım desenlerinden biri olan mediator tasarım desenini anlatacağım. Hadi başlayalım !
Table of Contents
Aslında bu tasarım deseni diğer tüm tasarım desenlerinde de olduğu gibi C# diline özgü bir kavram değil, tüm nesne yönelimli programlama dillerinde daha temiz kod yazabilmek için oluşturulmuş ve yazılımcılar tarafından da kabul görmüş yazılı olmayan kurallardır ve nesne yönelimli programlama yapılabilen tüm dillerde uygulanabilmektedir.
Mediator Tasarım Deseni Nedir?
Mediator tasarım deseni, bir nesnenin diğer nesnelerle doğrudan iletişim kurmak yerine bir aracı kullanarak iletişim kurmasını sağlayan bir yazılım tasarım desenidir. Bu desen, birçok nesne arasındaki bağımlılığı azaltarak, daha esnek ve yeniden kullanılabilir kod oluşturmayı sağlar. Bu makalede, C# programlama dilinde Mediator tasarım deseni ile ilgili bir örnek vereceğim.
Örnek Senaryo
Bir oda rezervasyon uygulaması geliştiriyorsunuz. Kullanıcılar, web sitesi üzerinden odaları görüntüleyebilir ve rezervasyon yapabilirler. Ancak, aynı odayı birden fazla kullanıcı aynı anda rezerve etmeye çalışırsa, sistemde bir çakışma oluşur ve bir kullanıcının rezervasyonu iptal edilir. Bu sorunu çözmek için, Mediator tasarım desenini kullanarak bir iletişim aracı oluşturabiliriz.
IRoomMediator Arayüzünün Oluşturulması
İlk adım olarak, Mediator arayüzünü tanımlayalım:
public interface IRoomMediator
{
void BookRoom(int roomId, int userId);
void AddUser(User user);
}
Bu arayüz, BookRoom ve AddUser adında iki yöntem içerir. BookRoom, bir kullanıcının bir odayı rezerve etmeye çalıştığında çağrılır ve AddUser, bir kullanıcının sisteme kaydedilmesi gerektiğinde çağrılır.
RoomMediator Sınıfının IRoomMediator Arayüzünden Türetilmesi
Ardından, Mediator sınıfını oluşturalım:
public class RoomMediator : IRoomMediator
{
private List<User> _users;
private Dictionary<int, User> _roomReservation;
public RoomMediator()
{
_users = new List<User>();
_roomReservation = new Dictionary<int, User>();
}
public void AddUser(User user)
{
_users.Add(user);
}
public void BookRoom(int roomId, int userId)
{
User user = _users.FirstOrDefault(u => u.Id == userId);
if (user == null)
{
throw new Exception("User not found.");
}
if (_roomReservation.ContainsKey(roomId))
{
User existingUser = _roomReservation[roomId];
if (existingUser.Id != userId)
{
// There is a conflict. Cancel the reservation.
Console.WriteLine($"Reservation conflict. Room {roomId} is already reserved by user {existingUser.Name}.");
_roomReservation.Remove(roomId);
}
}
else
{
_roomReservation.Add(roomId, user);
Console.WriteLine($"Room {roomId} is reserved by user {user.Name}.");
}
}
}
Bu sınıf, IRoomMediator arayüzünü uygular ve iki özel üye değişken içerir: _users ve _roomReservation. _users, sisteme kaydedilen tüm kullanıcıları içeren bir liste; _roomReservation, her odaya rezervasyon yapan kullanıcıları takip eden bir sözlüktür. AddUser yöntemi, bir kullanıcının sisteme kaydedilmesini sağlayarak, BookRoom yöntemi, bir kullanıcının bir odayı rezerve etmeye çalıştığında çağrılır. Bu yöntem, önce kullanıcının sistemde kayıtlı olup olmadığını kontrol eder. Daha sonra, oda numarasına karşılık gelen bir kullanıcı varsa, bir çakışma olduğu anlamına gelir ve önceki rezervasyon iptal edilir. Aksi takdirde, kullanıcının rezervasyonu kaydedilir.
User Sınıfının Oluşturulması
Son olarak, kullanıcı sınıfını tanımlayalım:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
private IRoomMediator _mediator;
public User(IRoomMediator mediator)
{
_mediator = mediator;
}
public void BookRoom(int roomId)
{
_mediator.BookRoom(roomId, Id);
}
}
Bu sınıf, bir kullanıcının temsil edildiği ve bir Mediator nesnesiyle ilişkilendirildiği yerdir. Kullanıcının BookRoom yöntemi, bir oda numarası alır ve Mediator nesnesi üzerinden rezervasyonu yapar.
Uygulamanın Test Edilmesi
Son olarak, uygulamayı test etmek için bir örnek senaryo oluşturalım:
RoomMediator mediator = new RoomMediator();
User alice = new User(mediator);
alice.Id = 1;
alice.Name = "Alice";
User bob = new User(mediator);
bob.Id = 2;
bob.Name = "Bob";
mediator.AddUser(alice);
mediator.AddUser(bob);
alice.BookRoom(101); // Room 101 is reserved by user Alice.
bob.BookRoom(101); // Reservation conflict. Room 101 is already reserved by user Alice.
bob.BookRoom(102); // Room 102 is reserved by user Bob.
Bu kodda, RoomMediator ve iki kullanıcı oluşturulur. Her kullanıcı Mediator nesnesiyle ilişkilendirilir ve Mediator nesnesine eklenir. Sonra, Alice, 101 numaralı odanın rezervasyonunu yapar ve başarılı olur. Bob, aynı odanın rezervasyonunu yapmaya çalışır, ancak önceki rezervasyon nedeniyle bir çakışma olduğu için başarısız olur. Son olarak, Bob, 102 numaralı odayı rezerve eder ve başarılı olur.
Sonuç
Mediator tasarım deseni, bu örnekte olduğu gibi, bir nesnenin diğer nesnelerle doğrudan iletişim kurmak yerine bir aracı kullanarak iletişim kurmasını sağlar. Bu, kodun daha esnek ve yeniden kullanılabilir olmasını sağlar.
Evet mediator tasarım deseni ve C# ile uygulanması bu şekilde olmakta. Tüm C# yazılarımıza buraya, diğer tasarım deseni yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.