中介者模式【行为模式C++】

1.简介

中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。

亦称: 调解人、控制器、Intermediary、Controller、Mediator

2.示例

中介者模式在 C++ 代码中最常用于帮助程序 GUI 组件之间的通信。 在 MVC 模式中, 控制器是中介者的同义词

假如你有一个创建和修改客户资料的对话框, 它由各种控件组成, 例如文本框 (Text­Field)、 复选框 (Checkbox) 和按钮 (Button) 等。

某些表单元素可能会直接进行互动。 例如, 选中 一个复选框后可能会显示一个隐藏文本框用于输入信息。 另一个例子是提交按钮必须在保存数据前校验所有输入内容

 

如果直接在表单元素代码中实现业务逻辑, 你将很难在程序其他表单中复用这些元素类。 例如, 由于复选框类与输入的文本框相耦合, 所以将无法在其他表单中使用它。

中介者模式建议你停止组件之间的直接交流并使其相互独立。 这些组件必须调用特殊的中介者对象, 通过中介者对象重定向调用行为, 以间接的方式进行合作。 最终, 组件仅依赖于一个中介者类, 无需与多个其他组件相耦合。

之前当用户点击按钮后, 它必须对所有表单元素数值进行校验。 使用中介者模式现在它的唯一工作是将点击事件通知给对话框。 收到通知后, 对话框可以自行校验数值或将任务委派给各元素。 这样一来, 按钮不再与多个表单元素相关联, 而仅依赖于对话框类

本例中用户触发的元素不会直接与其他元素交流, 即使看上去它们应该这样做。 相反, 元素只需让中介者知晓事件即可,中介者是整个认证对话框。 对话框知道具体元素应如何进行合作并促进它们的间接交流。 当接收到事件通知后, 对话框会确定负责处理事件的元素并据此重定向请求。

3.结构

3.1 实现方式

其结构包括以下几个要素:

  • 抽象中介者(Mediator):定义统一的接口,用于各个同事角色之间的通信。
  • 具体中介者(ConcreteMediator):维持对各个同事对象的引用,从具体的同事对象接收消息,向具体同事对象发出命令,通过协调各个同事对象来实现协作行为。
  • 抽象同事(Colleague):定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
  • 具体同事(具ConcreteColleague):实现了在抽象同事类中声明的抽象方法,每一个同事对象在需要和其他同事对象通信时先与中介者通信,通过中介者来间接完成与其他同事类的通信。
#include <cstdio>


//中介者接口
class Mediator {
public:
	virtual void broadcast(const char* message) = 0;
};

//同事接口
class Colleague {
private:
	Mediator *mediator;
public:
	Colleague(Mediator *mediator) {
		this->mediator = mediator;
	}
	void send(const char* message) {
		mediator->broadcast(message);
	}
	virtual void receive(const char* message) = 0;
};

//具体中介者
class ConcreteMediator : public Mediator {
private:
	Colleague *colleagues[10];
	int count;
public:
	ConcreteMediator() {
		count = 0;
	}
	void addColleague(Colleague *colleague) {
		colleagues[count++] = colleague;
	}
	void broadcast(const char* message) {
		for (int i = 0; i < count; i++)
			colleagues[i]->receive(message);
	}
};

//具体同事
class ConcreteColleague : public Colleague {
private:
	const char *name;
public:
	ConcreteColleague(const char *name, Mediator *mediator) : Colleague(mediator) {
		this->name = name;
	}
	void receive(const char* message) {
		printf("%s receive %s\n", name, message);
	}
};

int main() {
	ConcreteMediator mediator;
	ConcreteColleague colleague1("colleague1", &mediator);
	ConcreteColleague colleague2("colleague2", &mediator);
	mediator.addColleague(&colleague1);
	colleague1.send("HELLO");
	mediator.addColleague(&colleague2);
	colleague1.send("HI");
	return 0;
}
3.2 执行结果

4.中介者优缺点

优点:

  • 减少对象之间的耦合度,使其变得简单易维护。
  • 提高代码的重用性和可扩展性,增强了系统的灵活性和可维护性。
  • 降低了类的复杂度,将一对多转化成了一对一。

缺点:

  • 中介者对象通常具有较高的复杂性,难以实现。
  • 当对象之间的交互较少或简单时,中介者模式可能会增加系统的一些不必要的复杂性。
  • 随着系统的扩大,中介者模式的复杂度可能会增加,使得代码难以维护。

5 使用场景

  • 当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。
  • 当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。
  • 如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。

相关推荐

  1. 行为型设计模式中介模式

    2024-04-12 12:20:01       59 阅读
  2. 设计模式行为模式中介模式

    2024-04-12 12:20:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 12:20:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 12:20:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 12:20:01       87 阅读
  4. Python语言-面向对象

    2024-04-12 12:20:01       96 阅读

热门阅读

  1. npm 错误,ERESOLVE unable to resolve dependency tree

    2024-04-12 12:20:01       180 阅读
  2. 【LeetCode热题100】41. 缺失的第一个正数(数组)

    2024-04-12 12:20:01       38 阅读
  3. 鸿蒙原生应用开发-网络管理模块总述

    2024-04-12 12:20:01       40 阅读
  4. 持续集成相关概念

    2024-04-12 12:20:01       43 阅读
  5. Android 10.0 电话记录为空号触发蓝牙重启问题解决

    2024-04-12 12:20:01       46 阅读
  6. 【笔试】输入输出处理

    2024-04-12 12:20:01       48 阅读
  7. HashMap面试题

    2024-04-12 12:20:01       37 阅读
  8. Composer安装与配置

    2024-04-12 12:20:01       35 阅读
  9. C#常见的数据缓存方式详解与实例

    2024-04-12 12:20:01       79 阅读
  10. C# 程序重复启动,将程序显示到最前

    2024-04-12 12:20:01       42 阅读