欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

中介者模式(mediator)(C++)

程序员文章站 2024-03-23 08:31:22
...

什么是中介者模式

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

角色

角色 角色作用
抽象中介者 包含一个所有col对象,和一个抽象接口
具体中介者 实现具体接口
抽象同事 包含中介,以及与中介交互的接口
具体同事 实现接口

中介者模式(mediator)(C++)

#include <string>
#include <iostream>
#include<vector>
#include<initializer_list>
using namespace std;
class Colleague; \\必须前项申明,不然编译不过

class Mediator \\抽象中介者
{
public:
    virtual void send(std::string  msg, Colleague * p, string receiveName) = 0; \\send函数,用于col之间消息交互,包含消息msg,发送方p,和接收方name
};

class Colleague \\col抽象类
{
protected:
    Mediator * m_mediator; \\每个对象都应该认识中介
    string selfName; \\每个对象名字
public:
    Colleague(Mediator * p, string name)
    {
        m_mediator = p;
        selfName = name;
    }
    virtual void send(std::string msg, string receiveName) = 0;
    virtual void notify(std::string msg, string sendName) = 0;
    const string getSelfName()
    {
        return selfName;
    }
};

class ConcreteColleague : public Colleague
{
public:
    ConcreteColleague(Mediator * p, string name) : Colleague(p, name) {}
    void send(std::string msg, string receiveName)
    {
        m_mediator->send(msg, this, receiveName);
    }
    void notify(std::string msg, string sendName)
    {
        std::cout << sendName << "send" << msg << "to" << this->getSelfName() << std::endl;
    }
};


class ConcreteMediator : public Mediator
{
private:
    vector<Colleague *> collList;
public:
    void addColleague(initializer_list<Colleague *> initList)
    {
        for(auto it : initList)
            collList.push_back(it);
    }
    void send(std::string msg, Colleague * p, string receiveName)
    {
        // 这里接受来自一个同事发过来的消息,具体应该给谁要根据需求来
        // 这里知识一个很简单的应用。比如该类总可以是有两个队列。
        // 一个队列是客户,一个队列是客服
        for(auto it : collList)
        {
            if(receiveName == it->getSelfName())
            {
                it->notify(msg, p->getSelfName());
            }
        }
    }
};

int main()
{
    // 中介者模式
    ConcreteMediator * p = new ConcreteMediator();
    Colleague * pCol1 = new ConcreteColleague(p, "col1");
    Colleague * pCol2 = new ConcreteColleague(p, "col2");
    p->addColleague({pCol1, pCol2});
    pCol1->send("你下班了吗?", "col2");

    delete pCol1;
    delete pCol2;
    delete p;

    getchar();
    return 0;
}

这里我改变了很多实现,都是自己添加的
https://blog.csdn.net/konglongdanfo1/article/details/83381630
与该博客中实现有差别,但是具体的意义是一样的

应用场景

①优点

减少类间依赖,把一对多的依赖转变成一对一。同事类只依赖中介,降低类间耦合

②缺点,中介者会随着同事类的增多,逻辑越来越复杂

相关标签: 中介者模式