实验19:中介者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解中介者模式的动机,掌握该模式的结构;

2、能够利用中介者模式解决实际问题。

 

[实验任务一]:虚拟聊天室

虚拟聊天室实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:

1. 新的具体聊天室中发送的图片大小不得超过20M

2. 新的具体聊天室中发送的文字长度不得超过100个字符。

3. 新的具体会员类可以发送图片信息和文本信息。

4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。

修改客户端测试类,注意原有系统类代码和客户端代码的修改。

实验要求:

1. 画出对应的类图

2. 提交源代码

3. 注意编程规范。

1、类图

 

 

2、源代码

package org.example;

import java.util.ArrayList;
import java.util.List;

abstract class ChatRoom {
    protected List<Member> members = new ArrayList<>();
    protected List<String> messages = new ArrayList<>();

    // 添加成员
    public void addMember(Member member) {
        members.add(member);
    }

    // 移除成员
    public void removeMember(Member member) {
        members.remove(member);
    }

    // 发送信息
    public abstract void sendMessage(Member sender, String message);
}

package org.example;

import java.text.SimpleDateFormat;
import java.util.Date;

class ConcreteChatRoom extends ChatRoom {
    private static final int MAX_TEXT_LENGTH = 100;   // 最大文字长度
    private static final int MAX_IMAGE_SIZE = 20 * 1024 * 1024;  // 最大图片大小 20MB

    @Override
    public void sendMessage(Member sender, String message) {
        // 如果是文本消息,检查长度
        if (message.length() > MAX_TEXT_LENGTH) {
            System.out.println("消息内容超出最大字数限制!");
            return;
        }

        // 否则将消息保存
        messages.add(sender.getName() + ": " + message);
        System.out.println("发送成功: " + message);
    }

    // 发送图片
    public void sendImage(Member sender, byte[] image) {
        if (image.length > MAX_IMAGE_SIZE) {
            System.out.println("图片大小超出最大限制!");
            return;
        }
        System.out.println(sender.getName() + " 发送了一张图片");
    }

    // 获取聊天记录
    public void printMessages() {
        for (String message : messages) {
            System.out.println(message);
        }
    }
}

package org.example;

import java.text.SimpleDateFormat;
import java.util.Date;

class ConcreteMember extends Member {

    private ConcreteChatRoom chatRoom;

    public ConcreteMember(String name, ConcreteChatRoom chatRoom) {
        super(name);
        this.chatRoom = chatRoom;
        this.chatRoom.addMember(this);  // 加入聊天室
    }

    // 发送文本信息,并附加时间
    @Override
    public void sendMessage(String message) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String timeStamp = sdf.format(new Date());
        String messageWithTime = message + " (发送时间: " + timeStamp + ")";
        chatRoom.sendMessage(this, messageWithTime);
    }

    // 发送图片信息
    public void sendImage(byte[] image) {
        chatRoom.sendImage(this, image);
    }
}

package org.example;

abstract class Member {
    protected String name;

    public Member(String name) {
        this.name = name;
    }

    // 发送信息
    public abstract void sendMessage(String message);

    public String getName() {
        return name;
    }
}

package org.example;

public class Main {
    public static void main(String[] args) {
        // 创建聊天室
        ConcreteChatRoom chatRoom = new ConcreteChatRoom();

        // 创建会员
        ConcreteMember member1 = new ConcreteMember("Alice", chatRoom);
        ConcreteMember member2 = new ConcreteMember("Bob", chatRoom);

        // 会员发送文本消息
        member1.sendMessage("你好,Bob!");
        member2.sendMessage("你好,Alice!");

        // 发送超长文本消息
        member1.sendMessage("这是一个非常长的消息,超过了最大字数限制...");

        // 发送图片
        byte[] image = new byte[15 * 1024 * 1024]; // 模拟一张小于 20MB 的图片
        member1.sendImage(image);

        // 发送超过 20MB 的图片
        byte[] largeImage = new byte[25 * 1024 * 1024]; // 超过 20MB
        member2.sendImage(largeImage);

        // 打印聊天记录
        System.out.println("\n聊天记录:");
        chatRoom.printMessages();
    }
}

 

3、运行截图

 

posted @ 2024-11-18 09:13  不会JAVA的小袁  阅读(30)  评论(0编辑  收藏  举报