概念:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
- 抽象主题:或者叫被观察者,可以持有、增加、删除观察者对象。
- 具体主题:实现抽象主题定义的操作,并定义一个状态,每当状态改变时,通知所有观察者。
- 抽象观察者:为所有观察者定义抽象操作,如update()方法,用于接收具体主题的状态变化。
- 具体观察者:具体实现接收到状态变化后的逻辑。
用一个例子帮助大家理解:
public interface Observer {
void update(String message);
}
public 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 interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String message);
}
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void setState(String state) {
this.state = state;
notifyObservers("状态被更新为: " + state);
}
public String getState() {
return state;
}
}
public class Demo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setState("Start");
subject.setState("Processing");
subject.removeObserver(observer1);
subject.setState("Stop");
}
}
如果大家需要视频版本的讲解,欢迎大家关注我的B站:
【天哥不爱学习的个人空间-哔哩哔哩】 https://b23.tv/HxwqjXl