首页 > 其他分享 >实验19:中介者模式

实验19:中介者模式

时间:2024-11-18 09:10:52浏览次数:1  
标签:String 19 void 中介 发送 实验 chatRoom message public

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

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、运行截图

 

标签:String,19,void,中介,发送,实验,chatRoom,message,public
From: https://www.cnblogs.com/yuanxinglan/p/18551671

相关文章

  • 实验二:逻辑回归算法实现与测试
    一、实验目的深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用Python语言实现对数几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试集(注意同分布取样);(2)使用训练......
  • 软件设计-Tutorial19
    packageTutorial19;//中介者接口publicinterfaceMediator{voidsendMessage(AbstractChatRoomchatRoom,AbstractMembermember,Stringmessage);voidsendPicture(AbstractChatRoomchatRoom,AbstractMembermember,byte[]picture);}packageTutori......
  • 11.5实验10:组合模式
    [实验任务一]:组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。实验要求:1.文件的执行不需真正实现,只需简单提示即可;2.提交源代码;3.注意编程规范。  publicabstractclassAbstractFile{     publicabstractvoidadd(AbstractFileele);    ......
  • 11.6实验11:装饰模式
    [实验任务一]:手机功能的升级用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音、振动外,还有灯光闪烁提示。实验要求:1. 提交类图;   2. 提交源代码;packagetest1......
  • 11.7实验12:外观模式
    [实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如果某一过程发生错误则计算机启动失败。......
  • cpp 实验4
    1.hpp2#pragmaonce3#include<iostream>4#include<vector>5#include<string>6#include<algorithm>7#include<numeric>8#include<iomanip>9usingnamespacestd;10classGradeCalc:publicvector<int>......
  • 20222408 2024-2025-1 《网络与系统攻防技术》实验六实验报告
    1.实验内容1.1实验要求(1)掌握metasploit、nmap的用法。(2)学习前期渗透的方法。(3)利用4个漏洞,实现对靶机的攻击。1.2学习内容(1)metasploit的用法:可以简单总结为“Search-Use-Show-Set-Exploit/run”。(2)四种漏洞的原理。a.Vsftpd源码包后门漏洞:在特定版本的vsftpd服务......
  • 20222326 2024-2025-1 《网络与系统攻防技术》实验六实验报告
    一、实验内容实验内容:掌握metasploit的用法,下载完官方靶机Metasploitable2后,可以通过前期渗透、Vsftpd源码包后门漏洞(21端口)、SambaMS-RPCShell命令注入漏洞(端口139)、JavaRMISERVER命令执行漏洞(1099端口)和PHPCGI参数执行注入漏洞(80端口)来具体实践,掌握metasploit,本周学习内......
  • Solution - Codeforces 1957E Carousel of Combinations
    首先这个\(C(i,j)\bmodj\)的形式就非常怪,于是首先肯定要先研究一下这个值。先考虑如何求\(C(i,j)\)。可以考虑先选出要用的\(j\)个数,再乘上其排列成环的方案数,那么有\(C(i,j)=\binom{i}{j}\times(j-1)!\)。那么就是来考虑\(\binom{i}{j}\times(j-1)!\bmod......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第八周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标功能设计与面向对象设计面向对象设计过程面向对象语言三要素汇编、编译、解释、执行作业正文https:/......