首页 > 其他分享 >中介者模式

中介者模式

时间:2024-12-29 22:10:49浏览次数:3  
标签:String void 模式 发送 中介 chatRoom message public

实验19:中介者模式

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

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

类图

 

 源代码

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();
    }
}

  

 

标签:String,void,模式,发送,中介,chatRoom,message,public
From: https://www.cnblogs.com/pinganxile/p/18639661

相关文章

  • 备忘录模式
    实验 20:备忘录模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解备忘录模式的动机,掌握该模式的结构;2、能够利用备忘录模式解决实际问题。 [实验任务一]:多次撤销 改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、Array......
  • 观察者模式
    实验21:观察者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解观察者模式的动机,掌握该模式的结构;2、能够利用观察者模式解决实际问题。[实验任务一]:股票提醒当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下......
  • 装饰模式
    实验11:装饰模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解装饰模式的动机,掌握该模式的结构;2、能够利用装饰模式解决实际问题。[实验任务]:手机功能的升级用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone......
  • 单例模式
    实验7:单例模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。[实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。类图  源代码publicclassStuden......
  • 适配器模式
    实验八适配器模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解适配器模式的动机,掌握该模式的结构;2、能够利用适配器模式解决实际问题。[实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。类图源代码publicinterfaceDog{......
  • 桥接模式
    实验9:桥接模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解桥接模式的动机,掌握该模式的结构;2、能够利用桥接模式解决实际问题。[实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。类图源代......
  • 外观模式
    实验12:外观模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解外观模式的动机,掌握该模式的结构;2、能够利用外观模式解决实际问题。[实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如......
  • 工厂方法模式
    目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。实验要求:1.画出对应的类图;2.提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;3.注......
  • 抽象工厂模式
    使用抽象工厂模式,完成下述产品等级结构:  1. 画出对应的类图;   2. 提交源代码;publicinterfaceSkin{    voidshow();}publicinterfaceGender{    voidshow();}publicinterfaceHumanFactory{    SkincreateSkin();    GendercreateG......
  • 建造者模式
    [实验任务一]:计算机组装使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起构成计算机,计算机的类型可以是笔记本,也可以是台式机。  源代码:interfaceBuilder{    voidsetCPU(Stringcpu);    voidsetRam(intram);  ......