10/9
软件设计 石家庄铁道大学信息学院
实验19:中介者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解中介者模式的动机,掌握该模式的结构;
2、能够利用中介者模式解决实际问题。
[实验任务一]:虚拟聊天室
在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:
1. 新的具体聊天室中发送的图片大小不得超过20M。
2. 新的具体聊天室中发送的文字长度不得超过100个字符。
3. 新的具体会员类可以发送图片信息和文本信息。
4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。
修改客户端测试类,注意原有系统类代码和客户端代码的修改。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
// 抽象中介者
interface Mediator {
void chat(String msg, ChatRoom chatRoom);
}
// 具体中介者
class ConcreteMediator implements Mediator {
private List<ChatRoom> chatRooms = new ArrayList<>();
public void registerChatRoom(ChatRoom chatRoom) {
chatRooms.add(chatRoom);
}
@Override
public void chat(String msg, ChatRoom chatRoom) {
for (ChatRoom room : chatRooms) {
if (room != chatRoom) {
room.receive(msg);
}
}
}
}
// 抽象聊天室
interface ChatRoom {
void send(String msg);
void receive(String msg);
}
// 具体聊天室1
class ConcreteChatRoom1 implements ChatRoom {
private ConcreteMediator mediator;
public ConcreteChatRoom1(ConcreteMediator mediator) {
this.mediator = mediator;
}
@Override
public void send(String msg) {
mediator.chat(msg, this);
}
@Override
public void receive(String msg) {
System.out.println("ChatRoom1 received: " + msg);
}
}
// 具体聊天室2
class ConcreteChatRoom2 implements ChatRoom {
private ConcreteMediator mediator;
public ConcreteChatRoom2(ConcreteMediator mediator) {
this.mediator = mediator;
}
@Override
public void send(String msg) {
if (checkTextLength(msg) && checkImageSize(msg)) {
mediator.chat(msg, this);
}
}
@Override
public void receive(String msg) {
System.out.println("ChatRoom2 received: " + msg);
}
private boolean checkTextLength(String msg) {
return msg.length() <= 100;
}
private boolean checkImageSize(String msg) {
// 假设msg包含图片大小信息
return msg.getBytes().length <= 20 * 1024 * 1024;
}
}
// 抽象用户
interface User {
void sendMessage(String msg);
void receiveMessage(String msg);
}
// 具体用户1
class ConcreteUser1 implements User {
private ConcreteMediator mediator;
public ConcreteUser1(ConcreteMediator mediator) {
this.mediator = mediator;
}
@Override
public void sendMessage(String msg) {
mediator.chat(msg, this);
}
@Override
public void receiveMessage(String msg) {
System.out.println("User1 received: " + msg);
}
}
// 具体用户2
class ConcreteUser2 implements User {
private ConcreteMediator mediator;
public ConcreteUser2(ConcreteMediator mediator) {
this.mediator = mediator;
}
@Override
public void sendMessage(String msg) {
String timeStampedMsg = addTime(msg);
mediator.chat(timeStampedMsg, this);
}
@Override
public void receiveMessage(String msg) {
System.out.println("User2 received: " + msg);
}
private String addTime(String msg) {
return msg + " - " + new SimpleDateFormat("HH:mm:ss").format(new Date());
}
}
// 客户端测试类
public class ChatRoomTest {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteChatRoom1 chatRoom1 = new ConcreteChatRoom1(mediator);
ConcreteChatRoom2 chatRoom2 = new ConcreteChatRoom2(mediator);
ConcreteUser1 user1 = new ConcreteUser1(mediator);
ConcreteUser2 user2 = new ConcreteUser2(mediator);
mediator.registerChatRoom(chatRoom1);
mediator.registerChatRoom(chatRoom2);
user1.sendMessage("Hello ChatRoom1");
user2.sendMessage("Hello ChatRoom2");
chatRoom1.send("Hello User1");
chatRoom2.send("Hello User2");
}
}
3. 注意编程规范。

浙公网安备 33010602011771号