进步始于交流
收获源于分享

C++设计模式-中介者模式

介绍

  • Mediator 抽象中介者角色
    抽象中介者角色定义统一的接口, 用于各同事角色之间的通信。
  • Concrete Mediator 具体中介者角色
    具体中介者角色通过协调各同事角色实现协作行为, 因此它必须依赖于各个同事角色。
  • Colleague 同事角色
    每一个同事角色都知道中介者角色, 而且与其他的同事角色通信的时候, 一定要通过中介者角色协作。

每个同事类的行为分为两种:

  • 自发行为(Self-Method):同事本身的行为, 比如改变对象本身的状态, 处理自己的行为等,与其他的同事类或中介者没有任何的依赖
  • 依赖方法(DepMethod):必须依赖中介者才能完成的行为

优点: 一对多的依赖变成了一对一,降低耦合

缺点: 同事类越多, 中介者的逻辑就越复杂

应用:机场调度中心、MVC框架、媒体网关、中介服务

范例

抽象中介

#ifndef MEDIATOR_H
#define MEDIATOR_H
#include "colleague.h"
class Mediator {
public:
    virtual void setC1(Colleague *c1) = 0;
    virtual void setC2(Colleague *c2) = 0;
    virtual void doSomething1() = 0;
    virtual void doSomething2() = 0;
};
#endif // MEDIATOR_H

具体中介

#ifndef CONCRETEMEDIATOR_H
#define CONCRETEMEDIATOR_H
#include <QDebug>
#include "mediator.h"
class ConcreteMediator : public Mediator {
public:
    void setC1(Colleague *c1) override {
        c1_ = c1;
    }
    void setC2(Colleague *c2) override {
        c2_ = c2;
    }
    void doSomething1() override {
        qDebug()<<"mediator get c1 sended message";
        c2_->selfMethod();
    }
    void doSomething2() override {
        qDebug()<<"mediator get c2 sended message";
        c1_->selfMethod();
    }
private:
    Colleague *c1_;
    Colleague *c2_;
};
#endif // CONCRETEMEDIATOR_H

抽象同事

#ifndef COLLEAGUE_H
#define COLLEAGUE_H
class Colleague {
public:
    virtual void depMethod() = 0;
    virtual void selfMethod() = 0;
};
#endif // COLLEAGUE_H

具体同事-两个

#ifndef CONCRETECOLLEAGUE_H
#define CONCRETECOLLEAGUE_H
#include <QDebug>
#include "mediator.h"
#include "colleague.h"
class ConcreteColleague1 : public Colleague {
public:
    //通过构造函数传递中介者
    ConcreteColleague1(Mediator *mediator) {
        mediator_ = mediator;
    }
    //自有方法 self-method
    void selfMethod() override {
        qDebug()<<"c1 get mediator message";
    }
    //依赖方法 dep-method
    void depMethod() override {
        qDebug()<<"c1 send message";
        mediator_->doSomething1();
    }
private:
    Mediator *mediator_;
};
class ConcreteColleague2 : public Colleague {
//通过构造函数传递中介者
public:
    ConcreteColleague2(Mediator *mediator) {
        mediator_ = mediator;
    }
    void selfMethod() override {
        qDebug()<<"c2 get mediator message";
    }
    void depMethod() override {
        qDebug()<<"c2 send message";
        mediator_->doSomething2();
    }
private:
    Mediator *mediator_;
};
#endif // CONCRETECOLLEAGUE_H

使用

#include "concretecolleague.h"
#include "concretemediator.h"
int main(int argc, char *argv[]) {
    //建立中介,完成联系
    Mediator *m = new ConcreteMediator;
    Colleague *c1 = new ConcreteColleague1(m);
    Colleague *c2 = new ConcreteColleague2(m);
    m->setC1(c1);
    m->setC2(c2);
    c1->depMethod();
    c2->depMethod();
}

结果

c1 send message
mediator get c1 sended message
c2 get mediator message
c2 send message
mediator get c2 sended message
c1 get mediator message

同事类要使用构造函数注入中介者, 而中介者使用getter/setter方式注入同事类, 因为同事类必须有中介者, 而中介者却可以只有部分同事类

源码GitHub:CppDesignPattern
相关链接:C++设计模式

赞(0) 打赏
未经允许不得转载:Coologic » C++设计模式-中介者模式

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏