中介者模式

介绍:

  中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

定义:

  用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

结构图: 

 

代码:

//Mediator类,抽象中介者类

class Mediator

{

public:

  void Send(const String &message,const Colleague &cColleague) = 0;  //定义一个抽象的发送消息的方法,输入同事对象和消息字段

}

//Colleague类,抽象同事类

class Colleague

{

protect:

  Mediator m_cMediator;

public:

  //得到中介者对象

  Colleague(const Mediator &cMediator)

  {

    this.m_cMediator = cMediator;

  }

  //发送消息是通过中介者

  void Send(const String &message)

  {

    m_cMediator.Send(message,this);

  }

  void Notify(const String &message) = 0;//接到消息的处理需要各个具体同事自己实现

}

//ConcreteMediator类,具体中介者类

class ConcreteMediator : Mediator

{

protect:

  //中介者需要了解所有具体同事类

  ConcreteColleagueA m_cConcreteColleagueA;

  ConcreteColleagueB m_cConcreteColleagueB;

public:

  //判断并处理对象间的交互逻辑

  void Send(const String &message,const Colleague &cColleague

  {

    if(cColleague == m_cConcreteColleagueA)

    {

      ConcreteColleagueB.Notify(message);

    }

    else

    {

      ConcreteColleagueA.Notify(message);      

    }

  }

}

//具体同事类

class ConcreteColleagueA :Colleague

{

public:

  //得到中介者对象

  Colleague(const Mediator &cMediator)

  {

    this.m_cMediator = cMediator;

  }

  //接到消息的具体处理

  void Notify(const String &message)

  {

    。。。;

  }

}

class ConcreteColleagueB :Colleague

{

public:

  //得到中介者对象

  Colleague(const Mediator &cMediator)

  {

    this.m_cMediator = cMediator;

  }

  //接到消息的具体处理

  void Notify(const String &message)

  {

    。。。;

  }

}

//客户端 

Mediator m = new ConcreteMediator()//创建一个中介者

Colleague A = new ConcreteColleagueA(m)//创建一个同事A并让他认识中介者

Colleague B = new ConcreteColleagueB(B)//创建一个同事B并让他认识中介者 

m.m_cConcreteColleagueA = A;//让中介者认识A

 m.m_cConcreteColleagueB = B;//让中介者认识B

A.Send("Hello");//A通过中介者发送hello给B

A.Send("Nice to meet you");//B接到A的hello,并向A发一个很高兴见到你。

 

使用时机:

一组定义良好的对象,现在要进行复杂的相互通信。或者想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

 

优点:

1、简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。

2、提供系统的灵活性,使得各个同事对象独立而易于复用。

 

缺点:

1、中介者模式中,把交互复杂性变成了中介者的复杂性,这就使得中介者比任何一个通讯对象都复杂。

2、新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

posted @ 2020-08-23 20:26  吉尔加斯  阅读(122)  评论(0编辑  收藏  举报