概念:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
- 抽象主题:或者叫被观察者,可以持有、增加、删除观察者对象。
- 具体主题:实现抽象主题定义的操作,并定义一个状态,每当状态改变时,通知所有观察者。
- 抽象观察者:为所有观察者定义抽象操作,如update()方法,用于接收具体主题的状态变化。
- 具体观察者:具体实现接收到状态变化后的逻辑。
用一个例子帮助大家理解:
public interface Observer {void update(String message);
}public class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic 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;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic 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