在Java中实现观察者模式,需要定义两个角色:观察者(Observer)和被观察者(Subject)。观察者可以注册到被观察者,当被观察者状态发生变化时,观察者会收到通知并进行相应的处理。
以下是一个简单的示例代码,演示如何实现观察者模式:
import java.util.ArrayList;
import java.util.List;
// 观察者接口
interface Observer {
void update(String message);
}
// 被观察者接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 具体的观察者类
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}
// 具体的被观察者类
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String message;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(message);
}
}
public void setMessage(String message) {
this.message = message;
notifyObservers();
}
}
public class Main {
public static void main(String[] args) {
ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
ConcreteObserver observer2 = new ConcreteObserver("Observer 2");
ConcreteSubject subject = new ConcreteSubject();
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setMessage("Hello World!");
}
}
在上述代码中,ConcreteObserver
实现了Observer
接口,并实现了update
方法,用于接收被观察者的消息。ConcreteSubject
实现了Subject
接口,实现了注册观察者、移除观察者和通知观察者的方法。被观察者状态发生变化时,调用notifyObservers
方法通知所有观察者。
在Main
类中,创建了两个观察者observer1
和observer2
,以及一个被观察者subject
。将观察者注册到被观察者后,调用setMessage
方法改变被观察者的状态,观察者将收到相应的通知并输出消息。
以上就是一个简单实现观察者模式的示例代码,你可以根据自己的需求进行修改和扩展。