中介者模式--设计模式

简介: 中介者模式--设计模式

中介者模式


一、动机


1.在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。


2.在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。


二、介绍


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


主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。


何时使用: 多个类相互耦合,形成了网状结构。


如何解决: 将上述网状结构分离为星型结构。


关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。


应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。


优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。


**缺点:**中介者会庞大,变得复杂难以维护。


使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。


注意事项: 不应当在职责混乱的时候使用。


三、结构


四、要点总结


1.将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象相互关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。


2.随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。


3.Facade模式是解耦系统间(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。


五、代码展示

#include <iostream>
#include <vector>

using namespace std;

#define DELETE(pointer) delete pointer; pointer=nullptr

class Colleague;

class IMediator //抽象产品
{
protected:
  vector<Colleague *> colleagues; // 维护和封装一系列同事对象

public:
  IMediator() : colleagues(0) {}
  virtual ~IMediator() {}

  virtual void add(Colleague *colleague) = 0; // 增加同事类
  virtual void send(Colleague *colleague) = 0; // 转发同事类消息
  
};

class Colleague
{
protected:
  IMediator *mediator; // 中介者接口

public:
  Colleague(IMediator *mediator) :mediator(mediator) {} 
  virtual void notify() = 0; // 要发消息的内容
  virtual void send() = 0; // 消息发布到中介者动作
  
};

class ConcreteColleague1 : public Colleague //具体同事1
{
public:
  ConcreteColleague1(IMediator *mediator) : Colleague(mediator) {}
  virtual void notify() { cout << "我是租客,要租房!" << endl; }
  virtual void send() { mediator->send(this); }
};

class ConcreteColleague2 : public Colleague //具体同事2
{
public:
  ConcreteColleague2(IMediator *mediator) : Colleague(mediator) {}
  virtual void notify() { cout << "我是房东,要出租房!" << endl; }
  virtual void send() { mediator->send(this); }
};

class ConcreteMediator : public IMediator //具体中介者,要放在具体类同事1和具体同事2的后面,否则调用notify函数会报错没定义
{
public:
  void add(Colleague *colleague) override { colleagues.push_back(colleague); }
  void send(Colleague *colleague) override {
    for (auto *iter : colleagues)
      if (iter == colleague)
      {
        iter->notify();
        break;
      }
  }
};

void doMediatorPattern()
{
  // 初始化中介者对象、同事1对象、同事2对象
  IMediator *mediator = new ConcreteMediator();
  Colleague *colleague1 = new ConcreteColleague1(mediator);
  Colleague *colleague2 = new ConcreteColleague2(mediator);
  mediator->add(colleague1); // 中介者把同事加入同事集合
  mediator->add(colleague2);

  colleague1->send(); // 租客在中介者发布租房信息
  colleague2->send(); // 房东也在中介者发布出租房信息

  DELETE(colleague2);
  DELETE(colleague1);
  DELETE(mediator);
}

int main()
{
  doMediatorPattern();

  system("pause");
  return 1;
}

目录
相关文章
|
8月前
|
设计模式 前端开发
设计模式21 - 中介者模式【【Mediator Pattern】
设计模式21 - 中介者模式【【Mediator Pattern】
30 0
|
8月前
|
设计模式 调度
行为型设计模式09-中介者模式
行为型设计模式09-中介者模式
25 0
|
8月前
|
设计模式 C++
设计模式之中介者模式(C++)
设计模式之中介者模式(C++)
|
4天前
|
设计模式
中介者模式-大话设计模式
中介者模式-大话设计模式
7 1
|
4天前
|
设计模式 Java 程序员
Java设计模式之中介者模式详解
Java设计模式之中介者模式详解
|
10天前
|
设计模式
设计模式之中介者模式
设计模式之中介者模式
|
23天前
|
设计模式 前端开发 NoSQL
设计模式第八讲:观察者模式和中介者模式详解
 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
177 0
|
1月前
|
设计模式 Go
[设计模式 Go实现] 行为型~中介者模式
[设计模式 Go实现] 行为型~中介者模式
|
1月前
|
设计模式 Java
小谈设计模式(26)—中介者模式
小谈设计模式(26)—中介者模式
|
1月前
|
设计模式 Java
23种设计模式,中介者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第8天】中介者模式是一种行为设计模式,它通过一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
48 8