定义:
定义一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。
作用:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
意义:
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
使用条件:
一个对象的状态发生改变,所有的依赖对象都将得到通知,进行通知。
观察者模式包含以下几个核心角色:
主题
- 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
观察者
- 观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
具体主题
- 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
具体观察者
- 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。
示例及代码:
猫大叫一声,所有老鼠都开始逃跑,主人被惊醒。
import java.util.ArrayList;
import java.util.List;// 主题接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}// 观察者接口
interface Observer {void update();
}// 具体主题实现类:猫
class Cat implements Subject {private List<Observer> observers = new ArrayList<>();@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update();}}// 猫大叫public void meow() {System.out.println("猫大叫一声!");notifyObservers();}
}// 具体观察者实现类:老鼠
class Mouse implements Observer {@Overridepublic void update() {System.out.println("老鼠开始逃跑!");}
}// 具体观察者实现类:主人
class Owner implements Observer {@Overridepublic void update() {System.out.println("主人被惊醒!");}
}public class Main {public static void main(String[] args) {// 创建主题对象:猫Cat cat = new Cat();// 创建具体观察者对象:老鼠Mouse mouse1 = new Mouse();Mouse mouse2 = new Mouse();// 注册观察者:老鼠cat.registerObserver(mouse1);cat.registerObserver(mouse2);// 创建具体观察者对象:主人Owner owner = new Owner();// 注册观察者:主人cat.registerObserver(owner);// 猫大叫,触发通知cat.meow();}
}