Mediator tasarım deseni, aynı tipteki veya aynı arayüzü uygulayan nesneler arasında iletişimi sağlayan tasarım desenidir.
Nesneler arasında direkt iletişim kurmaktansa, ortaya bir ara sınıf (Mediator) koyarak tüm haberleşme işlerini bu ortak nesne üzerinden gerçekleştirerek direkt olarak birbirileri ile haberleşmelerini engellemektir bu desendeki amacımız. Bunların yanı sıra sınıfların sayısı arttıkça, aralarındaki bağımlılıklar da artar, uygulamanın bakımı ve değiştirilmesi zorlaşır. Mediator tasarım deseni, bu sınıflar arasındaki bağımlılıkları azaltmaya ve aralarındaki iletişimi kolaylaştırmaya da yarar.
Bu tasarım desenine ait UML diyagramı aşağıdaki gibidir.
Mediator:Colleague nesneler arasındaki iletişim arayüzünü tanımlar.
ConcreteMediator:Mediator arayüzünü uygular ve Colleague nesneleri arasındaki iletişimi koordine eder.
Colleague: Haberleşme için ortak bir arayüz sağlar.
ConcreteColleague:Colleague arayüzünü uygular ve diğer Mediator sayesinde diğer Colleague sınıf örnekleri ile iletişim kurmaya çalışır.
Senaryo olarak online bir sohbet odası olduğu ve bu odada kullanıcıların 1-1 görüşme yaptıkları kabul edilsin. Desen gereği kullanıcılar direkt birbirleri ile iletişim kuramayacakları için işlemler Mediator üzerinden gerçekleştirilecektir.
C# Kod Örneği:
// Haberleşme için ortak bir arayüz sağlar.// Haberleşme Mediator tarafından gerçekleşeceği için bir örneğini tutar.// Mesaj alma ve mesaj gönderme özellikleri içermektedir.// UML diyagramındaki Colleague yapısına denk gelir.abstractclassUser{publicint id;publicstring name;privateIChatRoomMediator _chatRoomMediator;publicUser(IChatRoomMediator chatRoomMediator) { _chatRoomMediator = chatRoomMediator; }publicvoidReceiveMessage(string message) {Console.WriteLine($"{name} received new message. Message: {message}"); }publicvoidSendMessage(string message,int userId) {Console.WriteLine($"{name} send new message to: {userId} id user.");_chatRoomMediator.SendMessage(message, userId); }}
// Colleague (User) soyutundan türer.// Mediator sayesinde diğer sınıf örnekler ile iletişim kurar.// UML diyagramındaki ConcreteColleague yapısına denk gelmektedir.classChatUser:User{publicChatUser(IChatRoomMediator chatRoomMediator) : base(chatRoomMediator) { }}
// Colleague (User) nesneler arasındaki iletişim arayüzünü tanımlar.// UML diyagramındaki Mediator arayüzüne denk gelmektedir.interfaceIChatRoomMediator{voidSendMessage(string message,int userId);voidAddUserInRoom(User user);}
IChatRoomMediator chatRoom =newChatRoomMediator();// Sohbet odasına dahil olacak kullanıcıların oluşturulması.// Ortak Mediator arayüzü ile haberleşmesi.User yusuf =newChatUser(chatRoom);yusuf.id=1;yusuf.name="Yusuf";User sema =newChatUser(chatRoom);sema.id=2;sema.name="Semanur";User derya =newChatUser(chatRoom);derya.id=3;derya.name="Derya";User aleyna =newChatUser(chatRoom);aleyna.id=4;aleyna.name="Aleyna";// Mediator içerisindeki kullanıcı listesine atama işlemleri.chatRoom.AddUserInRoom(yusuf);chatRoom.AddUserInRoom(sema);chatRoom.AddUserInRoom(derya);chatRoom.AddUserInRoom(aleyna);yusuf.SendMessage("Naber kız?",sema.id);sema.SendMessage("Sanane be?",yusuf.id);// output:// Yusuf send new message to: 2 id user.// Semanur received new message.Message: Naber kız?// Semanur send new message to: 1 id user.// Yusuf received new message.Message: Sanane be?