12.17
实验19:中介者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解中介者模式的动机,掌握该模式的结构;
2、能够利用中介者模式解决实际问题。
[实验任务一]:虚拟聊天室
在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:
1. 新的具体聊天室中发送的图片大小不得超过20M。
2. 新的具体聊天室中发送的文字长度不得超过100个字符。
3. 新的具体会员类可以发送图片信息和文本信息。
4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。
修改客户端测试类,注意原有系统类代码和客户端代码的修改。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
package org.test19;
public interface ChatMediator {
void sendMessage(Message message, Member member);
}
package org.test19;
public class Client {
public static void main(String[] args) {
ChatMediator chatMediator = new ConcreteChatMediator();
Member member1 = new ConcreteMember("Alice", chatMediator);
Member member2 = new ConcreteMember("Bob", chatMediator);
member1.sendMessage(new TextMessage("Hello, how are you?"));
member2.sendMessage(new ImageMessage(15 * 1024 * 1024)); // This should work
member1.sendMessage(new TextMessage("I'm good, thanks! How about you?"));
member2.sendMessage(new ImageMessage(25 * 1024 * 1024));
}
}
package org.test19;
public class ConcreteChatMediator implements ChatMediator{
@Override
public void sendMessage(Message message, Member member) {
// 处理消息的发送逻辑
member.receiveMessage(message);
}
}
package org.test19;
public class ConcreteMember implements Member{
private String name;
private ChatMediator chatMediator;
ConcreteMember(String name, ChatMediator chatMediator) {
this.name = name;
this.chatMediator = chatMediator;
}
@Override
public void sendMessage(Message message) {
if (message != null) {
// 在这里进行图片大小和文本长度的判断
if (message instanceof TextMessage) {
if (((TextMessage) message).getContent().length() > 100) {
System.out.println("Text message too long. Limit is 100 characters. Message not sent.");
return;
}
} else if (message instanceof ImageMessage) {
if (((ImageMessage) message).getSizeInMegaBytes() > 20) {
System.out.println("Image size too large. Message not sent.");
return;
}
}
chatMediator.sendMessage(message, this);
} else {
System.out.println("Message not sent.");
}
}
@Override
public void receiveMessage(Message message) {
if (message != null) {
System.out.println(name + " received: " + message.getContent());
} else {
System.out.println(name + " did not receive the message.");
}
}
}
package org.test19;
public class ImageMessage extends Message{
private int sizeInBytes;
ImageMessage(int sizeInBytes) {
this.sizeInBytes = sizeInBytes;
}
int getSizeInMegaBytes() {
return sizeInBytes / (1024 * 1024);
}
@Override
public String getContent() {
return "Image Size: " + sizeInBytes + " bytes";
}
}
package org.test19;
public interface Member {
void sendMessage(Message message);
void receiveMessage(Message message);
}
package org.test19;
public abstract class Message {
public abstract String getContent();
}
package org.test19;
public class TextMessage extends Message{
private String content;
TextMessage(String content) {
this.content = content;
}
@Override
public String getContent() {
return content;
}
}package org.test19;
public interface ChatMediator {
void sendMessage(Message message, Member member);
}
package org.test19;
public class Client {
public static void main(String[] args) {
ChatMediator chatMediator = new ConcreteChatMediator();
Member member1 = new ConcreteMember("Alice", chatMediator);
Member member2 = new ConcreteMember("Bob", chatMediator);
member1.sendMessage(new TextMessage("Hello, how are you?"));
member2.sendMessage(new ImageMessage(15 * 1024 * 1024)); // This should work
member1.sendMessage(new TextMessage("I'm good, thanks! How about you?"));
member2.sendMessage(new ImageMessage(25 * 1024 * 1024));
}
}
package org.test19;
public class ConcreteChatMediator implements ChatMediator{
@Override
public void sendMessage(Message message, Member member) {
// 处理消息的发送逻辑
member.receiveMessage(message);
}
}
package org.test19;
public class ConcreteMember implements Member{
private String name;
private ChatMediator chatMediator;
ConcreteMember(String name, ChatMediator chatMediator) {
this.name = name;
this.chatMediator = chatMediator;
}
@Override
public void sendMessage(Message message) {
if (message != null) {
// 在这里进行图片大小和文本长度的判断
if (message instanceof TextMessage) {
if (((TextMessage) message).getContent().length() > 100) {
System.out.println("Text message too long. Limit is 100 characters. Message not sent.");
return;
}
} else if (message instanceof ImageMessage) {
if (((ImageMessage) message).getSizeInMegaBytes() > 20) {
System.out.println("Image size too large. Message not sent.");
return;
}
}
chatMediator.sendMessage(message, this);
} else {
System.out.println("Message not sent.");
}
}
@Override
public void receiveMessage(Message message) {
if (message != null) {
System.out.println(name + " received: " + message.getContent());
} else {
System.out.println(name + " did not receive the message.");
}
}
}
package org.test19;
public class ImageMessage extends Message{
private int sizeInBytes;
ImageMessage(int sizeInBytes) {
this.sizeInBytes = sizeInBytes;
}
int getSizeInMegaBytes() {
return sizeInBytes / (1024 * 1024);
}
@Override
public String getContent() {
return "Image Size: " + sizeInBytes + " bytes";
}
}
package org.test19;
public interface Member {
void sendMessage(Message message);
void receiveMessage(Message message);
}
package org.test19;
public abstract class Message {
public abstract String getContent();
}
package org.test19;
public class TextMessage extends Message{
private String content;
TextMessage(String content) {
this.content = content;
}
@Override
public String getContent() {
return content;
}
}
3. 注意编程规范。
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号