定义

  1. 用一个中介对象来封装一系列的对象交互。中介者可以使对象不需要显式地相互引用,从而使其耦合分散,而且可以独立地改变它们之间的交互。
  2. 简单来说就是将 对象与对象之间的交互,改为 对象与中介间交互。交互的细节有中介承担。

使用场景

  1. 各国之间的贸易,改为各国通过WTO来互相贸易
  2. MVC框架,控制器作为中介调节 视图 和 模型
  3. 聊天室,聊天者 与 聊天室的关系
  4. 现实世界的中介
  5. 多个类互相耦合,形成网状结构。这时可以考虑使用中介模式,中介者一般用于定义良好的但是以复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多子类的场合。

代码实现

//抽象中介类
abstract class Mediator
{
     public abstract void Send(string message, Colleague colleague);
}

//抽象同事类
abstract class Colleague
{
    protected Mediator mediator;
    

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

}

//具体中介类
class ConcreteMediator: Mediator
{
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    public ConcreteColleague1 Colleague1 { set{ colleague1 = value; } }
    public ConcreteColleague2 Colleague2 { set{ colleague2 = value; } }
    
    public override void Send(string message,Colleague colleague)
    {
         if(colleague == colleague1)
         {
              colleague2.Notify(message);
         }
         else
         {
              colleague1.Notify(message);
         }
    }

}


//具体同事类
class ConcreteColleague1: Colleague
{
     public ConcreteColleague1(Mediator mediator): base(mediator)
     {
     

     }
    
      public void Send(string message)
      {
           mediator.Send(message, this);
      }
    
      public void Notify(string message)
      {
            Console.WriteLine("同事1得到消息:{0}", message);
      }

}

class ConcreteColleague2: Colleague
{
     public ConcreteColleague2(Mediator mediator): base(mediator)
     {
     

     }
    
      public void Send(string message)
      {
           mediator.Send(message, this);
      }
    
      public void Notify(string message)
      {
            Console.WriteLine("同事2得到消息:{0}", message);
      }

}


void Main()
{
    ConcreteMediator m = new ConcreteMediator(); //中介者对象

    ConcreteColleague1 c1 = new ConcreteColleague1(m); // 让同事认识中介
    ConcreteColleague2 c2 = new ConcreteColleague2(m);
    
    m.Colleague1 = c1; //让中介认识同事
    m.Colleague2 = c2;
    
    c1.Send("你好,我是c1");
    c2.Send("你好,我是c2");

}

优点缺点

  1. 降低了类的复杂度,将一对多转化为一对一
  2. 各类间的解耦
  3. 符合迪米特原则(只与自己认识的人通信)
  4. 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
  5. 当系统出现多对多交互复杂的对象群时,不要先考虑使用中介者模式,应该先考虑系统设计上是否合理。由于具体中介类控制集中化,交互的复杂性变为中介者的复杂性,这就使得中介类比任何一个和它交互的类复杂。