【声明】本题目来源于卡码网(题目页面 (kamacoder.com))
【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】
-- 什么是中介者模式 (第16种模式)
中介者模式(Mediator Pattern)也被称为调停者模式,是⼀种⾏为型设计模式,它通过⼀个中介对象来封装⼀组对象之间的交互,从⽽使这些对象不需要直接相互引⽤。这样可以降低对象之间的耦合度,使系统更容易维护和扩展。
当⼀个系统中的对象有很多且多个对象之间有复杂的相互依赖关系时,其结构图可能是下⾯这样的。
这种依赖关系很难理清,这时我们可以引⼊⼀个中介者对象来进⾏协调和交互。中介者模式可以使得系统的⽹状结构变成以中介者为中⼼的星形结构,每个具体对象不再通过直接的联系与另⼀个对象发⽣相互作⽤,⽽是通过“中介者”对象与另⼀个对象发⽣相互作⽤。
中介者模式包含以下⼏个基本角色:
以Java代码先作以说明:
1. 抽象中介者
// 抽象中介者
public abstract class Mediator {
void register(Colleague colleague);
// 定义⼀个抽象的发送消息⽅法
public abstract void send(String message, Player player);
}
2. 具体中介者
// 具体中介者
public class ConcreteMediator extends Mediator {
private List colleagues = new ArrayList<>();
public void register((Colleague colleague) {
colleagues.add(colleague);
}
@Override
public void send(String message, Colleague colleague) {
for (Colleague c : colleagues) {
// 排除发送消息的同事对象
if (c != colleague) {
c.receive(message);
}
}
}
}
3. 同事对象
// 同事对象
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
// 发送消息
public abstract void send(String message);
// 接收消息
public abstract void receive(String message);
}
4. 具体同事对象1
// 具体同事对象1
class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void send(String message) {
mediator.send(message, this);
}
@Override
public void receive(String message) {
System.out.println("ConcreteColleague1 received: " + message);
}
}
5. 具体同事对象2
// 具体同事对象2
class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void send(String message) {
mediator.send(message, this);
}
@Override
public void receive(String message) {
System.out.println("ConcreteColleague2 received: " + message);
}
}
6. 客户端
/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file MediatorMode.hpp
* @brief 中介者模式
* @autor 写代码的小恐龙er
* @date 2024/01/18
*/
// 客户端
public class Main{
public static void main(String[] args) {
// 创建中介者
Mediator mediator = new ConcreteMediator();
// 创建同事对象
Colleague colleague1 = new ConcreteColleague1(mediator);
Colleague colleague2 = new ConcreteColleague2(mediator);
// 注册同事对象到中介者
mediator.register(colleague1);
mediator.register(colleague2);
// 同事对象之间发送消息
colleague1.send("Hello from Colleague1!");
colleague2.send("Hi from Colleague2!");
}
}
中介者模式使得同事对象不需要知道彼此的细节,只需要与中介者进⾏通信,简化了系统的复杂度,也降低了各对象之间的耦合度,但是这也会使得中介者对象变得过于庞⼤和复杂,如果中介者对象出现问题,整个系统可能会受到影响。中介者模式适⽤于当系统对象之间存在复杂的交互关系或者系统需要在不同对象之间进⾏灵活的通信时使⽤,可以使得问题简化,
1. 题目描述
小明正在设计一个简单的多人聊天室系统,有多个用户和一个聊天室中介者,用户通过中介者进行聊天,请你帮他完成这个系统的设计。
2. 输入描述
第一行包括一个整数N,表示用户的数量(1 <= N <= 100) 第二行是N个用户,比如User1 User2 User3,用空格分隔 第三行开始,每行包含两个字符串,表示消息的发出者和消息内容,用空格分隔;
3. 输出描述
对于每个用户,输出一行,包含该用户收到的所有消息内容。
4. C++编码
/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file MediatorMode.hpp
* @brief 中介者模式
* @autor 写代码的小恐龙er
* @date 2024/01/18
*/
#include
#include
#include
#include
中介者模式(Mediator Pattern)和代理模式(Proxy Pattern) 在某些表述上有些类似,但是他们是完全不同的两个设计模式,中介者模式的⽬的是降低系统中各个对象之间的直接耦合,通过引⼊⼀个中介者对象,使对象之间的通信集中在中介者上。而在代理模式中,客户端通过代理与⽬标对象进⾏通信。代理可以在调⽤⽬标对象的⽅法前后进⾏⼀些额外的操作,其⽬的是控制对对象的访问,它们分别解决了不同类型的问题。
......
To be continued.