
الگوی طراحـــــــــی Mediator
الگوی طراحی Mediator یک الگوی رایج در برنامهنویسی شیءگرا است که برای کاهش وابستگیها بین اجزاء یک سیستم استفاده میشود. این الگو اجازه میدهد تا اجزاء با یکدیگر ارتباط برقرار کنند، اما به جای تعامل مستقیم با یکدیگر، با یک واسط (Mediator) تعامل داشته باشند. این واسط مسئول مدیریت واسطهای ارتباطی بین اجزاء است و میتواند به صورت مرکزی کنترل کنندهی ترافیک بین آنها عمل کند.
مفهوم الگوی Mediator به این صورت است که ما یک کلاس Mediator داریم که اجزاء را در خود ثبت میکند و متدهای مختلفی برای مدیریت ارتباط بین آنها فراهم میکند. اجزاء نیز با داشتن ارتباط با Mediator میتوانند اطلاعات را برای اجزاء دیگر ارسال کنند و برعکس، از اطلاعاتی که توسط دیگر اجزاء ارسال میشود، استفاده کنند. این الگو به اجزاء اجازه میدهد که بدون نیاز به دانستن همدیگر، با یکدیگر ارتباط برقرار کنند و تغییرات در یک اجزاء تأثیری روی دیگر اجزاء نداشته باشد.
معمولاً اجزاء اصلی الگوی طراحی Mediator شامل موارد زیر هستند:
1. Mediator: رابط یا کلاسی است که متدهای مربوط به ارتباط و تعامل بین اجزاء را تعیین میکند.
2. ConcreteMediator: کلاسی است که از رابط Mediator ارثبری میکند و متدهای مربوط به ارتباط و تعامل بین اجزاء را پیادهسازی میکند.
3. Colleague: رابط یا کلاسهایی هستند که به Mediator وابستهاند و با یکدیگر ارتباط برقرار میکنند.
4. ConcreteColleague: کلاسهایی هستند که از رابط Colleague ارثبری میکنند و متدهای مربوط به ارتباط با سایر اجزاء را پیادهسازی میکنند.
حالا بیایید کد مربوط به این مثال را در زبان سی شارپ بنویسیم:
فرض کنید ما یک سیستم چت آنلاین داریم که شامل چندین کاربر است. هر کاربر میتواند پیامهایی را به کاربران دیگر ارسال کند. از الگوی Mediator استفاده میکنیم تا ارتباط بین کاربران را مدیریت کنیم و امکان ارسال پیام بین آنها را فراهم کنیم.
1. Mediator:
1public interface IChatMediator
2{
3 void SendMessage(string message, IUser user);
4 void AddUser(IUser user);
5}
2. ConcreteMediator:
1public class ChatMediator : IChatMediator
2{
3 private List<IUser> _users = new List<IUser>();
4
5 public void AddUser(IUser user)
6 {
7 _users.Add(user);
8 }
9
10 public void SendMessage(string message, IUser sender)
11 {
12 foreach (var user in _users)
13 {
14 if (user != sender) // برای ارسال پیام نیازی به خود کاربر ارسال کننده نداریم.
15 user.ReceiveMessage(message);
16
17
18 }
19 }
20}
3. Colleague:
1public interface IUser
2{
3 void SendMessage(string message);
4 void ReceiveMessage(string message);
5}
4. ConcreteColleague:
1public class User : IUser
2{
3 private IChatMediator _mediator;
4 private string _name;
5
6 public User(IChatMediator mediator, string name)
7 {
8 _mediator = mediator;
9 _name = name;
10 }
11
12 public void SendMessage(string message)
13 {
14 Console.WriteLine($"{_name} sends: {message}");
15 _mediator.SendMessage(message, this);
16 }
17
18 public void ReceiveMessage(string message)
19 {
20 Console.WriteLine($"{_name} receives: {message}");
21 }
22}
5. Client (کلاینت):
1public class Program
2{
3 public static void Main()
4 {
5 IChatMediator mediator = new ChatMediator();
6
7 IUser user1 = new User(mediator, "User1");
8 IUser user2 = new User(mediator, "User2");
9 IUser user3 = new User(mediator, "User3");
10
11 mediator.AddUser(user1);
12 mediator.AddUser(user2);
13 mediator.AddUser(user3);
14
15 user1.SendMessage("Hello, everyone!");
16 }
17}
خروجی برنامه به صورت زیر خواهد بود:
User1 sends: Hello, everyone!
User2 receives: Hello, everyone!
User3 receives: Hello, everyone!
در این مثال، با استفاده از الگوی Mediator، ما ارتباط بین کاربران را با استفاده از کلاس `ChatMediator` مدیریت کردیم. کاربران با استفاده از کلاس `User` از طریق Mediator میتوانند پیامهای خود را به کاربران دیگر ارسال کنند و پیامها به صورت مرکزی و توسط Mediator بین کاربران منتقل میشوند. این الگو اجازه میدهد که هر کاربر تنها با Mediator ارتباط برقرار کند و نیازی به آشنایی با دیگر کاربران ندارد. این کار باعث کاهش وابستگی بین اجزاء میشود و سبب افزایش قابلیتهای قابل توسعهپذیری سیستم میشود.