设计模式之中介者模式

中介者模式

简介

参考链接

中介者模式是一种行为设计模式,当一个项目中模块比较多的时候,如果模块之间交互很多,很复杂,可以考虑用中介者模式,每个模块都通过中介者进行交互,各个模块之间不会有耦合。实现了一种类与类之间的交互方式。
MVC 框架中,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

代码实现

#include <iostream>

class Mediator;
class IUser;

// 中介者接口类
class IMediator {
public:
  virtual void transmit(const std::string &msg, IUser *user) = 0;
};

// 模块user抽象类
class IUser {
public:
  IUser() {}
  void send(const std::string &msg) {
    mediator_->transmit(msg, this);
  }
  virtual void set_mediator(IMediator *mediator) {
    mediator_ = mediator;
  }
  virtual void recv(const std::string &msg) = 0;

  IMediator *mediator_ = nullptr;
};

// 具体user1
class User1: public IUser {
public:
  User1() {}
  virtual void recv(const std::string &msg) {
    std::cout << "User1 recv msg: " << msg << std::endl;
  }
};
// 具体user2
class User2: public IUser {
public:
  User2() {}
  virtual void recv(const std::string &msg) {
    std::cout << "User2 recv msg: " << msg << std::endl;
  }
};

// 具体中介者类
class Mediator: public IMediator {
public:
  Mediator(IUser *user1, IUser *user2): user1_(user1), user2_(user2) {
    user1_->set_mediator(this);
    user2_->set_mediator(this);
  }
  // transmit 实现每个模块的交互
  // user1->send==>user2->revv
  // user2->send==>user1->revv
  virtual void transmit(const std::string &msg, IUser *user) {
    if (user == user1_) {
      user2_->recv(msg);
    } else if(user == user2_) {
      user1_->recv(msg);
    }
  }

  IUser *user1_ = nullptr;
  IUser *user2_ = nullptr;
};

int main() {
  IUser *user1 = new User1();
  IUser *user2 = new User2();
  IMediator *mediator = new Mediator(user1, user2);

  user1->send("Hello");
  user2->send("Hello");
  user1->send("Hello");
  user1->send("Hello");

  delete user1;
  delete user2;
  delete mediator;
}

// 运行结果
/*
	User2 recv msg: Hello
	User1 recv msg: Hello
	User2 recv msg: Hello
	User2 recv msg: Hello
*/

上面的例子中,user1和user2两个模块通过中介者进行交互,user分别实现了send用来发送数据,recv来接受数据。它俩通过中介者进行通讯,在mediator类中,处理了两个模块的交互逻辑,在上面的例子中就是user1和user2之间互相发送接受消息。

优缺点

优点:

  • 单一职责原则。你可以将多个组件间的交流抽取到同一位置, 使其更易于理解和维护。
  • 开闭原则。 你无需修改实际组件就能增加新的中介者。
  • 你可以减轻应用中多个组件间的耦合情况。
  • 你可以更方便地复用各个组件。

缺点:

  • 当组件越来越多是,中介者类会变得很复杂,会处理很多逻辑。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chasentech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值