定义:
定义一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。
作用:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
意义:
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
使用条件:
一个对象的状态发生改变,所有的依赖对象都将得到通知,进行通知。
观察者模式包含以下几个核心角色:
主题
- 主题(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<>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
// 猫大叫
public void meow() {
System.out.println("猫大叫一声!");
notifyObservers();
}
}
// 具体观察者实现类:老鼠
class Mouse implements Observer {
@Override
public void update() {
System.out.println("老鼠开始逃跑!");
}
}
// 具体观察者实现类:主人
class Owner implements Observer {
@Override
public 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();
}
}