观察者模式(Observer Pattern)是一种软件设计模式,它定义了一种对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。该模式也被称为发布-订阅模式(Publish/Subscribe Pattern)。
在观察者模式中,有两种角色:被观察者(Subject)和观察者(Observer)。被观察者维护了一个观察者列表,并提供了注册和删除观察者的接口。观察者注册成功后,被观察者会在状态发生改变时通知所有的观察者。观察者接收到通知后,会调用被观察者的接口获取最新的状态信息,并进行相应的处理。
下面我们来分析观察者模式类图关系。
一、UML类图
观察者模式的UML类图如下所示:

其中,Subject是被观察者接口,ConcreteSubject是具体的被观察者实现类;Observer是观察者接口,ConcreteObserver是具体的观察者实现类。
二、角色介绍
1. Subject
被观察者接口,定义了注册、删除和通知观察者的方法。具体的被观察者实现类需要实现该接口,并在状态发生改变时通知所有的观察者。
2. ConcreteSubject
具体的被观察者实现类,维护了一个观察者列表。当状态发生改变时,会通知所有的观察者。
3. Observer
观察者接口,定义了接收通知并更新的方法。具体的观察者实现类需要实现该接口,并注册到具体的被观察者实现类中。
4. ConcreteObserver
具体的观察者实现类,实现了接收通知并更新的方法。当被观察者发生状态改变时,会调用该类的update()方法。
三、实现步骤
观察者模式的实现步骤如下:
1. 定义被观察者接口Subject
```java
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
```
2. 定义观察者接口Observer
```java
public interface Observer {
void update();
}
```
3. 定义具体的被观察者实现类ConcreteSubject
```java
public class ConcreteSubject implements Subject {
private List
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();
}
}
}
```
4. 定义具体的观察者实现类ConcreteObserver
```java
public class ConcreteObserver implements Observer {
private int observerState;
public void update() {
observerState = ConcreteSubject.getState();
}
}
```
5. 使用观察者模式
```java
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer = new ConcreteObserver();
subject.registerObserver(observer);
subject.setState(1);
subject.setState(2);
subject.removeObserver(observer);
}
}
```
四、优缺点分析
观察者模式有以下优点:
1. 解耦合。被观察者和观察者之间的依赖关系由观察者模式处理,从而减少了它们之间的耦合。
2. 可扩展性。添加或删除观察者不会对其他部分造成影响,从而增强了系统的可扩展性。
3. 合理性。如果一个对象需要将它的状态改变通知其他对象的时候,我们可以考虑使用观察者模式。
观察者模式有以下缺点:
1. 有可能出现循环依赖的情况。如果观察者之间存在循环依赖的情况,将无法实现正确的通知。
2. 有可能导致性能问题。如果被观察者频繁地改变状态,可能会导致大量的通知,从而导致性能问题。
扫码咨询 领取资料