C++中介者模式
- 介绍
- 代码示例
- 结论
介绍
中介者模式是一种行为型设计模式,它允许对象之间通过中介者对象进行通信,而不是直接相互引用。这样可以降低对象之间的耦合度,使得对象之间的交互更加灵活。
中介者模式的核心思想是将对象之间的交互行为集中到中介者对象中,由中介者对象来协调对象之间的交互。这样可以避免对象之间的直接交互,从而降低对象之间的耦合度,使得系统更加灵活、可扩展。
代码示例
以下是基于Qt示例代码,可直接运行,或将c++部分拆离,在其他IDE运行。
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <iostream>
#include <string>
#include <vector>
namespace Ui {
class MainWindow;
}
class Colleague;
// 抽象中介者类
class Mediator {
public:
virtual void send(string message, Colleague* colleague) = 0;
};
// 抽象同事类
class Colleague {
public:
Colleague(Mediator* mediator) : m_mediator(mediator) {}
virtual void send(string message) = 0;
virtual void receive(string message) = 0;
protected:
Mediator* m_mediator;
};
// 具体中介者类
class ConcreteMediator : public Mediator {
public:
void setColleague(Colleague* colleague) {
m_colleagues.push_back(colleague);
}
void send(string message, Colleague* colleague) {
for (auto c : m_colleagues) {
if (c != colleague) {
c->receive(message);
}
}
}
private:
vector<Colleague*> m_colleagues;
};
// 具体同事类
class ConcreteColleague1 : public Colleague {
public:
ConcreteColleague1(Mediator* mediator) : Colleague(mediator) {}
void send(string message) {
m_mediator->send(message, this);
}
void receive(string message) {
qDebug().noquote() << __FILE__ << __LINE__ << "ConcreteColleague1 received message: " << message << endl;
}
};
class ConcreteColleague2 : public Colleague {
public:
ConcreteColleague2(Mediator* mediator) : Colleague(mediator) {}
void send(string message) {
m_mediator->send(message, this);
}
void receive(string message) {
qDebug().noquote() << __FILE__ << __LINE__ << "ConcreteColleague2 received message: " << message << endl;
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ConcreteMediator mediator;
ConcreteColleague1 colleague1(&mediator);
ConcreteColleague2 colleague2(&mediator);
mediator.setColleague(&colleague1);
mediator.setColleague(&colleague2);
colleague1.send("Hello, colleague2!");
colleague2.send("Hi, colleague1!");
}
MainWindow::~MainWindow()
{
delete ui;
}
结论
中介者模式是一种行为型设计模式,它通过将对象间的交互行为集中到中介者对象中来降低对象间的耦合度。
在以上实现中,抽象中介者类定义了中介者的接口,具体中介者类实现了中介者的具体行为,抽象同事类定义了同事的接口,具体同事类实现了同事的具体行为。中介者对象通过调用同事对象的接口来实现同事对象间的交互。
具体中介者类维护了一个同事对象的列表,当一个同事对象发送消息时,中介者对象会遍历列表,将消息发送给除了发送者之外的其他同事对象。这样,同事对象之间的交互就不需要直接依赖彼此,而是通过中介者对象来实现。