中介者模式

举报
Further_Step 发表于 2024/12/12 17:02:07 2024/12/12
【摘要】 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞! 中介者模式(Mediator Pattern) 1. 定义中介者模式是一种行为型设计模式,它通过引入一个中介者对象来简化对象之间的通信。中介者模式的主要目的是减少多个对象之间的直接交互,使得这些对象不需要显式地相互引用,从而降低系统的耦合度。 2. 核心概念中介者(Mediator):定义一个接口,用于与各个同事对象(C...

喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞

中介者模式(Mediator Pattern)

1. 定义

中介者模式是一种行为型设计模式,它通过引入一个中介者对象来简化对象之间的通信。中介者模式的主要目的是减少多个对象之间的直接交互,使得这些对象不需要显式地相互引用,从而降低系统的耦合度。

2. 核心概念

  • 中介者(Mediator):定义一个接口,用于与各个同事对象(Colleague)进行通信。
  • 具体中介者(Concrete Mediator):实现中介者接口,知道并维护其各个同事对象,并负责协调这些对象之间的交互。
  • 同事类(Colleague):每个同事类都知道其中介者对象,并且在需要与其他同事通信时,通过中介者进行。

3. 使用案例

  • 聊天室:多个用户通过一个聊天室进行交流,聊天室作为中介者,处理用户之间的消息传递。
  • 航空交通控制系统:飞机、塔台、地面控制等通过一个中介者(如控制中心)进行协调。
  • GUI组件之间的交互:例如,按钮点击事件可能需要更新多个其他组件的状态,中介者可以管理这些组件之间的交互。

4. 优点与缺点

优点:

  • 降低了系统的复杂度,减少了类之间的依赖关系。
  • 提高了系统的灵活性和可扩展性。
  • 简化了对象协议,使得同事类之间的交互更加清晰。

缺点:

  • 中介者可能变得过于复杂,因为它集中了系统的控制逻辑。
  • 如果中介者设计不当,可能会导致系统的性能瓶颈。

5. 实现示例

C++ 实现

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

// 抽象同事类
class Colleague {
public:
    virtual void sendMessage(std::string message) = 0;
    virtual void receiveMessage(std::string message) = 0;
};

// 抽象中介者
class Mediator {
public:
    virtual void send(std::string message, Colleague* colleague) = 0;
};

// 具体同事类
class ConcreteColleague : public Colleague {
private:
    Mediator* mediator;
public:
    ConcreteColleague(Mediator* m) : mediator(m) {}

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

    void receiveMessage(std::string message) override {
        std::cout << "Received: " << message << std::endl;
    }
};

// 具体中介者
class ConcreteMediator : public Mediator {
private:
    std::vector<Colleague*> colleagues;
public:
    void addColleague(Colleague* colleague) {
        colleagues.push_back(colleague);
    }

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

int main() {
    ConcreteMediator* mediator = new ConcreteMediator();
    ConcreteColleague* user1 = new ConcreteColleague(mediator);
    ConcreteColleague* user2 = new ConcreteColleague(mediator);

    mediator->addColleague(user1);
    mediator->addColleague(user2);

    user1->sendMessage("Hello, World!");
    user2->sendMessage("Hi, User1!");

    delete user1;
    delete user2;
    delete mediator;
    return 0;
}

C# 实现

using System;
using System.Collections.Generic;

// 抽象同事类
public abstract class Colleague
{
    public abstract void SendMessage(string message);
    public abstract void ReceiveMessage(string message);
}

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

// 具体同事类
public class ConcreteColleague : Colleague
{
    private Mediator mediator;

    public ConcreteColleague(Mediator m)
    {
        mediator = m;
    }

    public override void SendMessage(string message)
    {
        mediator.Send(message, this);
    }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Received: {message}");
    }
}

// 具体中介者
public class ConcreteMediator : Mediator
{
    private List<Colleague> colleagues = new List<Colleague>();

    public void AddColleague(Colleague colleague)
    {
        colleagues.Add(colleague);
    }

    public override void Send(string message, Colleague sender)
    {
        foreach (var colleague in colleagues)
        {
            if (colleague != sender)
            {
                colleague.ReceiveMessage(message);
            }
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var mediator = new ConcreteMediator();
        var user1 = new ConcreteColleague(mediator);
        var user2 = new ConcreteColleague(mediator);

        mediator.AddColleague(user1);
        mediator.AddColleague(user2);

        user1.SendMessage("Hello, World!");
        user2.SendMessage("Hi, User1!");
    }
}

6. 类图

«abstract»Mediator+Send(message: string, colleague: Colleague)ConcreteMediator-colleagues: List<Colleague>+AddColleague(colleague: Colleague)+Send(message: string, colleague: Colleague)«abstract»Colleague+SendMessage(message: string)+ReceiveMessage(message: string)ConcreteColleague-mediator: Mediator+SendMessage(message: string)+ReceiveMessage(message: string)1..*

7. 总结

中介者模式通过引入一个中介者对象来管理对象之间的复杂交互,降低了系统的耦合度,提高了系统的可维护性和扩展性。在实际应用中,选择合适的中介者实现方式非常重要,以避免中介者本身成为系统的瓶颈。

欢迎关注、点赞、收藏!更多系列内容可以点击专栏目录订阅,感谢支持,再次祝大家祉猷并茂,顺遂无虞
在这里插入图片描述

若将文章用作它处,请一定注明出处,商用请私信联系我!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。