C# 设计模式-中介者模式

一.介绍  

  中介者模式(Mediator Pattern)。属于行为型模式。用一个中介对象来封装一序列的对象交互。中介者使得各对象之间不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

二.实现

  举个例子,用户聊天,A用户发了消息,B用户就能收到。B用户发的消息,A用户可以收到。按照一般的做法,A、B想要交互是需要两个类相互关联,这样A、B两类就会耦合,A类的变化就有可能影响到B类。使用中间者模式,就是在A类和B类的用户类中加个中间者类,A、B的交互通过中间者类处理,这样如果A类变动,会影响到的,也就只有A类和中间者类,减少用户类之间的耦合。

//抽象中介者
public abstract class Mediator
{
    public abstract void Send(string message, Colleague colleague);
}
//具体中介者
public class ConcreteMediator : Mediator
{
    private ColleagueA a;
    private ColleagueB b;
    public void SetColleague(ColleagueA a, ColleagueB b)
    {
        this.a = a;
        this.b = b;
    }

    public override void Send(string message, Colleague colleague)
    {
        if (colleague == this.a)
        {
            b.NotifyB(message);
        }
        else
        {
            a.NotifyA(message);
        }
    }
}

//抽象用户
public abstract class Colleague
{
    protected Mediator mediator;
    public Colleague(Mediator mediator)
    {
        this.mediator = mediator;
    }
    public abstract void Send(string message);
}
//具体用户
public class ColleagueA : Colleague
{
    public ColleagueA(Mediator mediator) : base(mediator)
    {
    }

    public override void Send(string message)
    {
        mediator.Send(message, this);
    }
    public void NotifyA(string message)
    {
        Console.WriteLine($"A get message:{message}");
    }
}
//具体用户
public class ColleagueB : Colleague
{
    public ColleagueB(Mediator mediator) : base(mediator)
    {
    }

    public override void Send(string message)
    {
        mediator.Send(message, this);
    }
    public void NotifyB(string message)
    {
        Console.WriteLine($"B get message:{message}");
    }
}

//调用
public static void Main(string[] args)
{
    ConcreteMediator mediator = new ConcreteMediator();
    ColleagueA a = new ColleagueA(mediator);
    ColleagueB b = new ColleagueB(mediator);

    mediator.SetColleague(a, b);
    a.Send("A send a message");
    b.Send("B send a message");
}

三.总结

  优点:

  1.简化了对象之间的关系,将系统中各个对象之间的相互关系进行封装,将各个用户类解耦,使系统变得松耦合。

  2.提高系统的灵活性,使得各个用户类对象独立而易于复用。

  缺点:

  1.中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出了问题,整个系统都是受到严重的影响。

  2.新加一个用户类后,不得不修改抽象中介者和具体中介者对象。

原文地址:https://www.cnblogs.com/shadoll/p/14377291.html