观察者模式实现
时间: 2023-06-29 08:07:24 浏览: 57
观察者模式是一种行为设计模式,用于在对象之间建立一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并进行更新。
以下是观察者模式的实现步骤:
1. 创建主题或被观察者类,该类维护一个观察者列表,并提供方法来注册、删除和通知观察者对象。主题类应该定义一个接口或抽象类,以便观察者能够实现并接收通知。
2. 创建观察者接口或抽象类,该接口或抽象类定义了一个更新方法,当主题发生更改时将被调用。
3. 创建具体的主题类,该类实现主题接口或抽象类,并维护一个状态变量。当状态变量发生更改时,通知所有已注册的观察者,并调用它们的更新方法。
4. 创建具体的观察者类,该类实现观察者接口或抽象类,并在更新方法中执行相应的操作。
以下是一个示例代码:
```java
//观察者接口
public interface Observer {
void update(int state);
}
//主题接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
//具体的主题类
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private int state;
public void setState(int state) {
this.state = state;
notifyObservers();
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
}
//具体的观察者类
public class ConcreteObserver implements Observer {
public void update(int state) {
System.out.println("State updated to " + state);
}
}
//使用示例
public class Example {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver();
ConcreteObserver observer2 = new ConcreteObserver();
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setState(1); //输出:State updated to 1
subject.removeObserver(observer1);
subject.setState(2); //输出:State updated to 2
}
}
```
在上面的示例中,我们首先定义了观察者接口和主题接口。然后,我们创建了具体的主题类`ConcreteSubject`,该类维护一个观察者列表,并实现了主题接口中的方法。当状态变量发生更改时,`ConcreteSubject`会通知所有已注册的观察者。
我们还创建了具体的观察者类`ConcreteObserver`,该类实现了观察者接口中的更新方法。在更新方法中,观察者可以执行相应的操作。
最后,我们在`Example`类中创建了一个`ConcreteSubject`对象和两个`ConcreteObserver`对象,并将观察者注册到主题上。当状态变量发生更改时,观察者会自动收到通知并执行相应的操作。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_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)