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 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错