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

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

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

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^