给一个Java实现观察者模式的代码
时间: 2024-03-08 11:48:00 浏览: 23
以下是一个简单的Java实现观察者模式的代码示例:
```
import java.util.ArrayList;
import java.util.List;
// 主题接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 观察者接口
interface Observer {
void update(String message);
}
// 具体主题类
class ConcreteSubject implements Subject {
private List<Observer> observers;
private String message;
public ConcreteSubject() {
observers = new ArrayList<>();
}
@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();
}
}
// 具体观察者类
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到消息:" + message);
}
}
// 测试代码
public class ObserverPatternDemo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer1");
Observer observer2 = new ConcreteObserver("Observer2");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setMessage("Hello, World!");
// 输出:
// Observer1 收到消息:Hello, World!
// Observer2 收到消息:Hello, World!
subject.removeObserver(observer1);
subject.setMessage("Goodbye, World!");
// 输出:
// Observer2 收到消息:Goodbye, World!
}
}
```
在上面的示例中,`ConcreteSubject`实现了`Subject`接口,包含了一个`observers`列表,用于保存所有的观察者对象。它还实现了`registerObserver`、`removeObserver`和`notifyObservers`方法,用于注册、移除和通知观察者。
`ConcreteObserver`实现了`Observer`接口,包含了一个`name`属性,用于标识观察者对象。它还实现了`update`方法,用于接收主题对象发来的消息。
在测试代码中,我们创建了一个`ConcreteSubject`对象,并分别注册了`observer1`和`observer2`两个观察者对象。然后通过`setMessage`方法设置了主题对象的消息,并观察到两个观察者对象都收到了消息。接着移除了`observer1`观察者对象,并再次设置了主题对象的消息,只有`observer2`收到了消息。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)