观察者模式
编制一个聊天程序,教师和学生均可加入或退出群聊,群消息只有群成员能够发送和接收。
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();
}
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:如果有经过和我相同操作的人也许都会碰上这样的问题,通过百度发现大家的回答都无法解决我的问题,所以打算自己动手找找原因