中介者模式

1、中介者模式概述:

中介者模式(Mediator Pattern)是一种行为型设计模式,它定义了一个中介对象来封装一组对象之间的交互。中介者模式的目的是减少对象之间的直接耦合,使得对象之间可以松散地协作。通过使用中介者,各个对象不需要直接相互引用,而是通过中介者对象来完成交互,从而降低了对象间的耦合性。

2、中介者模式的适用场景:

  • 当对象之间的交互产生了很多的耦合,这些对象之间的交互变得难以维护和理解时,可以考虑使用中介者模式将这些对象之间的交互进行封装。
  • 当你需要创建多个组件,它们之间需要相互通信,并且这些通信可能会发生变化时,可以使用中介者模式来简化组件间的通信。
  • 在图形界面编程中,多个组件之间的交互逻辑可以通过中介者模式集中处理,避免组件之间的直接引用。

3、中介者模式的优点:

  • 减少对象间的耦合:中介者模式通过将对象之间的交互封装到中介者对象中,降低了对象间的直接依赖,从而减轻了对象间的耦合。
  • 提高代码可维护性:通过将对象间的交互封装到中介者对象中,使得对象间的交互更容易维护和管理,有利于系统的扩展和维护。
  • 提高灵活性:中介者模式使得对象之间的交互可以更加灵活地进行调整,只需要修改中介者对象,而无需修改原来的对象。
  • 提高对象复用性:由于对象之间的交互被封装到中介者对象中,这些对象可以在其他系统中复用,而无需关心它们之间的交互。

举例:在一个聊天室系统中,多个用户需要相互通信。如果每个用户都直接与其他用户通信,那么系统的复杂度将非常高。通过引入一个聊天室(中介者)对象,用户之间只需要与聊天室进行交互,聊天室负责将消息转发给其他用户,从而降低了用户之间的耦合。

4、中介者模式的缺点:

  • 中介者对象可能过于复杂:中介者模式将对象间的交互集中到中介者对象中,随着系统功能的增加,中介者对象可能变得非常复杂,从而导致中介者对象变得难以维护和理解。
  • 过度使用中介者模式可能导致系统的性能降低:由于所有的交互都通过中介者进行,这可能导致中介者成为系统的性能瓶颈。在使用中介者模式时,需要权衡中介者带来的好处和可能存在的性能问题。

举例:在一个大型多人在线游戏中,如果使用一个中心化的服务器作为中介者来处理所有玩家之间的交互,随着玩家数量的增加,中心服务器的负载将变得非常高,可能导致性能问题。在这种情况下,可以考虑将中介者分布式地部署到多个服务器上,或者使用其他设计模式来优化系统架构。

5、用C++实现一个中介者模式例子:

#include <iostream>
#include <string>
#include <vector>

class Colleague;

// Mediator(中介者)接口
class Mediator {
public:
    virtual void sendMessage(const std::string& message, Colleague* sender) = 0;
};

// Colleague(同事)抽象类
class Colleague {
protected:
    Mediator* mediator;
    std::string name;

public:
    Colleague(Mediator* mediator, const std::string& name)
        : mediator(mediator), name(name) {}

    virtual void send(const std::string& message) {
        mediator->sendMessage(message, this);
    }

    virtual void receive(const std::string& message) {
        std::cout << name << " received: " << message << std::endl;
    }
};

// ConcreteMediator(具体中介者)类
class ConcreteMediator : public Mediator {
private:
    std::vector<Colleague*> colleagues;

public:
    void addColleague(Colleague* colleague) {
        colleagues.push_back(colleague);
    }

    void sendMessage(const std::string& message, Colleague* sender) override {
        for (auto colleague : colleagues) {
            if (colleague != sender) {
                colleague->receive(message);
            }
        }
    }
};

int main() {
    ConcreteMediator mediator;

    Colleague alice(&mediator, "Alice");
    Colleague bob(&mediator, "Bob");
    Colleague charlie(&mediator, "Charlie");

    mediator.addColleague(&alice);
    mediator.addColleague(&bob);
    mediator.addColleague(&charlie);

    alice.send("Hello, everyone!");
    bob.send("Hi, Alice!");
    charlie.send("Hey guys!");

    return 0;
}

这个例子中,Mediator 是一个中介者接口,定义了发送消息的方法。Colleague 是一个抽象类,代表各个同事类。ConcreteMediator 是具体的中介者实现,用于协调同事类之间的通信。Colleague类包含一个指向中介者的指针,这样它们就可以通过中介者发送和接收消息。

在主函数中,我们创建了一个 ConcreteMediator 实例,并添加了三个 Colleague 实例:Alice、Bob 和 Charlie。然后通过调用各个同事的 send 方法来发送消息,这些消息会通过中介者传递给其他同事。输出结果显示了每个同事接收到的消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

田翁野老

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

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

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

打赏作者

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

抵扣说明:

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

余额充值