m0_59030684 2023-04-05 09:21 采纳率: 70%
浏览 27
已结题

观察者模式编制一个聊天程序

观察者模式
编制一个聊天程序,教师和学生均可加入或退出群聊,群消息只有群成员能够发送和接收。

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-04-05 09:35
    关注
    import java.util.Scanner;
    import java.util.ArrayList;
    
    interface ChatObserver {
        void update(String userName, String message);
    }
    
    class ChatSubject {
        ArrayList<ChatObserver> observers = new ArrayList<>();
    
        public void addObserver(ChatObserver observer) {
            observers.add(observer);
        }
    
        public void removeObserver(ChatObserver observer) {
            observers.remove(observer);
        }
    
        public void notifyObservers(String userName, String message) {
            for (ChatObserver observer : observers) {
                observer.update(userName, message);
            }
        }
    }
    
    class User implements ChatObserver {
        String name;
        boolean isTeacher;
        ChatSubject chatSubject;
    
        public User(String name, boolean isTeacher, ChatSubject chatSubject) {
            this.name = name;
            this.isTeacher = isTeacher;
            this.chatSubject = chatSubject;
    
            chatSubject.addObserver(this);
        }
    
        public void update(String userName, String message) {
            if (userName.equals(name) || (!isTeacher && message.startsWith("@teacher"))) {
                System.out.println("[" + userName + "]:" + message);
            }
        }
    
        public String getName() {
            return name;
        }
    
        public boolean isTeacher() {
            return isTeacher;
        }
    
        public void sendMessage(String message) {
            chatSubject.notifyObservers(name, message);
        }
    
        public void leaveChat() {
            chatSubject.removeObserver(this);
            System.out.println(name + " 退出了群聊。");
        }
    }
    
    public class ChatProgram {
        public static void main(String[] args) {
            ChatSubject chatSubject = new ChatSubject();
            Scanner scanner = new Scanner(System.in);
    
            while (true) {
                System.out.println("请选择操作:");
                System.out.println("1. 加入群聊");
                System.out.println("2. 退出群聊");
                System.out.println("3. 发送消息");
                System.out.println("4. 退出程序");
    
                int choice = scanner.nextInt();
                scanner.nextLine();
    
                switch (choice) {
                    case 1:
                        System.out.println("请输入用户名:");
                        String name = scanner.nextLine();
                        System.out.println("请选择身份:");
                        System.out.println("1. 教师");
                        System.out.println("2. 学生");
                        boolean isTeacher = scanner.nextInt() == 1;
                        scanner.nextLine();
    
                        User user = new User(name, isTeacher, chatSubject);
                        System.out.println(name + " 加入了群聊。");
                        break;
                    case 2:
                        System.out.println("请输入用户名:");
                        name = scanner.nextLine();
                        boolean hasUser = false;
                        for (ChatObserver observer : chatSubject.observers) {
                            if (observer instanceof User && ((User) observer).getName().equals(name)) {
                                ((User) observer).leaveChat();
                                hasUser = true;
                                break;
                            }
                        }
                        if (!hasUser) {
                            System.out.println("未找到用户 " + name + "。");
                        }
                        break;
                    case 3:
                        System.out.println("请输入用户名:");
                        name = scanner.nextLine();
                        System.out.println("请输入消息:");
                        String message = scanner.nextLine();
    
                        hasUser = false;
                        for (ChatObserver observer : chatSubject.observers) {
                            if (observer instanceof User && ((User) observer).getName().equals(name)) {
                                ((User) observer).sendMessage(message);
                                hasUser = true;
                                break;
                            }
                        }
                        if (!hasUser) {
                            System.out.println("未找到用户 " + name + "。");
                        }
                        break;
                    case 4:
                        System.out.println("程序已退出。");
                        scanner.close();
                        System.exit(0);
                        break;
                    default:
                        System.out.println("输入格式错误,请重新输入。");
                        break;
                }
    
                System.out.println();
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 4月5日

悬赏问题

  • ¥15 h3.6m 人类行为预测论文复现
  • ¥50 wordpress项目注册报失败刷新后其实是成功状态,请求排查原因
  • ¥20 linxu服务器僵尸进程不释放,代码如何修改?
  • ¥15 pycharm激活不成功
  • ¥40 如果update 一个列名为参数的value
  • ¥15 基于51单片机的水位检测系统设计中LCD1602一直不显示
  • ¥15 OCS2安装出现问题,请大家给点意见
  • ¥15 ros小车启动launch文件报错
  • ¥15 vs2015到期想登陆但是登陆不上
  • ¥15 IPQ5018制作烧录固件,boot运行失败(操作系统-linux)(相关搜索:操作系统)(相关搜索:操作系统)