面向对象设计模式之中介者模式

本文介绍中介者模式的应用场景、优点及缺点,并通过一个C++代码示例详细解释了模式结构,包括抽象中介者、具体中介者、抽象同事类和具体同事类等关键组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

17、中介者模式(Mediater)

使用场景:

对象与对象之间存在大量的关联关系,导致它们之间的依赖关系结构混乱而且难以复用该对象,多个类相互耦合,形成了网状结构,将上述网状结构分离为星型结构。。例如,机场调度,mvc框架

优点:

a) 降低了类的复杂度,将一对多转化成了一对一,提高系统的灵活性,使得系统易于维护和扩展
b) 各个类之间的解耦,使得对象易于独立地被复用
c) 类之间各司其职,符合迪米特原则(最少知道原则)

缺点:

中介者会庞大臃肿,变得复杂难以维护

模式结构:

抽象中介者(Mediator):它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者(Concrete Mediator):实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
抽象同事类(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类(Concrete Colleague):是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。   
在这里插入图片描述

#include <iostream>
#include <vector>

using namespace std;
class Colleague;

// 抽象中介者
class Mediator {
public:
	virtual void addColleague(Colleague *colleague) = 0;
	virtual void relay(Colleague *cl) = 0; //转发
};

//抽象同事类
class Colleague {
public:
	Mediator *mediator;

public:
	void setMedium(Mediator *mediator) {
		this->mediator = mediator;
	}

public:
	virtual void receive() = 0;
	virtual void send() = 0;
};

// 具体中介者
class ConcreteMediator: public Mediator {
private:
	vector<Colleague*> colleaguesVec;
public:
	void addColleague(Colleague *colleague) {		
		colleaguesVec.push_back(colleague);
		colleague->setMedium(this);
		
	};
	void relay(Colleague *cl) {
		for (int i = 0; i < colleaguesVec.size(); i++) {
			if (colleaguesVec[i]!= cl) {
				colleaguesVec[i]->receive();
			}
		}
	}
};

//具体同事类
class ConcreteColleague1: public Colleague {
public:
	void receive() {
		cout << "具体同事类1: 收到请求。" << endl;
	};

    void send() {
		cout << "具体同事类1: 发出请求。" << endl;
		mediator->relay(this); //请中介者转发
	}
};

//具体同事类
class ConcreteColleague2: public Colleague {
public:
	void receive() {
		cout << "具体同事类2: 收到请求。" << endl;
	};

	void send() {
		cout << "具体同事类2: 发出请求。" << endl;
		mediator->relay(this); //请中介者转发
	};
};

int main()
{
	Mediator *md = new ConcreteMediator();
	Colleague *c1, *c2;
	c1 = new ConcreteColleague1();
	c2 = new ConcreteColleague2();
	md->addColleague(c1);
	md->addColleague(c2);
	c1->send();
	cout << "----------" << endl;
	c2->send();

	return 0;
}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值