Sobes.tech
Middle

Dasturlash kontekstida mediator nima?

sobes.tech AI

AIdan javob

Mediator — bu xulosa qilish uchun markazlashtirilgan ob'ektni taklif qiladigan xulq-atvor dizayni naqshidir, u boshqa ob'ektlar (hamkasblar) o'rtasidagi o'zaro ta'sirni boshqaradi. Ob'ektlar to'g'ridan-to'g'ri muloqot qilish o'rniga, ular mediator orqali o'zaro ta'sir qiladilar.

Mediatorni ishlatishning afzalliklari:

  • Bog'liqlikni kamaytirish: Ob'ektlar bir-biriga to'g'ridan-to'g'ri murojaat qilmaydi, bu ularning bog'liqligini kamaytiradi.
  • Boshqarishni soddalashtirish: Ob'ektlar o'rtasidagi o'zaro ta'sirlar bitta joyda jamlangan, bu ularni tushunishni va o'zgartirishni osonlashtiradi.
  • Qayta ishlatishni yaxshilash: Boshqa kontekstlarda foydalanish uchun alohida komponentlar, chunki ular tizimning boshqa komponentlariga juda bog'liq emas.

Kamchiliklar:

  • Mediatorning murakkabligini oshirish: O'zaro ta'sirlar soni ortib borishi bilan, mediator murakkab va qo'llab-quvvatlash uchun qiyin bo'lishi mumkin.
  • Ishlash qobiliyatining pasayishi ehtimoli: Barcha o'zaro ta'sirlar markaziy ob'ekt orqali o'tadi, bu qo'shimcha xarajatlar keltirib chiqarishi mumkin.

Oddiy amalga oshirish misoli:

// Mediator uchun interfeys
public interface IMediator
{
    void SendMessage(string message, Colleague colleague);
}

// Hamkasblar uchun asosiy sinf
public abstract class Colleague
{
    protected IMediator mediator;

    public Colleague(IMediator mediator)
    {
        this.mediator = mediator;
    }

    public abstract void ReceiveMessage(string message);
    public abstract void Send(string message);
}

// Aniq mediator
public class ConcreteMediator : IMediator
{
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    public ConcreteColleague1 Colleague1
    {
        set { colleague1 = value; }
    }

    public ConcreteColleague2 Colleague2
    {
        set { colleague2 = value; }
    }

    public void SendMessage(string message, Colleague colleague)
    {
        if (colleague == colleague1)
        {
            colleague2.ReceiveMessage(message);
        }
        else
        {
            colleague1.ReceiveMessage(message);
        }
    }
}

// Aniq hamkasblar
public class ConcreteColleague1 : Colleague
{
    public ConcreteColleague1(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Hamkasb 1 tomonidan qabul qilingan xabar: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Hamkasb 1 tomonidan yuborilgan xabar: {message}");
        mediator.SendMessage(message, this);
    }
}

public class ConcreteColleague2 : Colleague
{
    public ConcreteColleague2(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Hamkasb 2 tomonidan qabul qilingan xabar: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Hamkasb 2 tomonidan yuborilgan xabar: {message}");
        mediator.SendMessage(message, this);
    }
}

// Foydalanish misoli
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Salom, hamkasb 2!");
// colleague2.Send("Salom, hamkasb 1!");

Ko'pincha, yanada murakkab xabar almashish tizimlarini amalga oshirish uchun Observer kabi boshqa naqshlar bilan birga ishlatiladi. .NET kontekstida, u so'rovlar va buyruqlar bilan ishlash uchun kutubxonalar, masalan, MediatR, da keng qo'llaniladi.