由于软件系统中数据和对象之间的依赖性和耦合性越来越紧密,我们需要一种方法来解除它们之间的耦合。观察者模式是一种能够有效地将对象和数据解耦的设计模式。本文将从概念、结构、实现以及应用等多个角度,介绍Java观察者模式的实现。
概念
观察者模式是一种行为型设计模式,它建立一种对象之间的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。观察者模式中的“观察者”和“被观察者”分别指依赖的对象和发生变化的对象。
结构
观察者模式主要由四个角色组成:抽象被观察者(Subject)、具体被观察者(ConcreteSubject)、抽象观察者(Observer)和具体观察者(ConcreteObserver)。
具体实现
在Java中,我们可以通过继承java.util.Observable以及实现java.util.Observer接口来实现观察者模式。具体步骤如下:
1.定义抽象被观察者类Subject,并将需要被通知的观察者对象存储在一个ArrayList中。
```
public abstract class Subject extends Observable {
private ArrayList
public Subject() {
observers = new ArrayList<>();
}
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(Object object) {
for (Observer observer : observers) {
observer.update(this, object);
}
}
}
```
2.定义具体被观察者类ConcreteSubject,并在其内部状态发生改变时,调用notifyObservers()方法通知所有观察者
```
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
setChanged();
notifyObservers(state);
}
}
```
3.定义抽象观察者类Observer,定义一个update()方法用来接收被观察者的通知。
```
public interface Observer {
void update(Observable observable, Object object);
}
```
4.定义具体观察者类ConcreteObserver,实现update()方法并将自己注册到被观察者中。
```
public class ConcreteObserver implements Observer {
public void update(Observable observable, Object object) {
if (observable instanceof ConcreteSubject) {
System.out.println("观察者当前状态为:" + ((ConcreteSubject) observable).getState());
}
}
}
```
使用场景
观察者模式通常用于以下场景:
1. 一个对象的状态改变需要同时改变其它对象的状态
2. 一个对象必须通知其它对象,但它并不需要知道其它对象的细节
3. 当一个对象需要将自己的改变通知给其它对象,且这些对象可以根据自己的需求注册或取消注册来接收相应的通知。
扫码咨询 领取资料