观察者模式
观察者模式定义了一种一对多的依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。它通常用于事件处理系统,允许对象之间实现松耦合,便于扩展和维护。
观察者模式的结构
- Subject(主题/被观察者):管理所有的观察者对象,提供注册和删除观察者的方法。当自身状态改变时,它负责通知所有观察者。
- Observer(观察者):定义一个更新接口,用于接收来自被观察者的通知。
- ConcreteSubject(具体主题):具体的被观察者对象,状态发生变化时通知观察者。
- ConcreteObserver(具体观察者):具体的观察者对象,实现了观察者接口,并在接收到通知时做出反应。
举例
假设我们有一个股票市场系统,股票价格变动时需要通知所有的投资者。我们可以用观察者模式来实现这个场景。
package com.example.demo.demos.test;
import java.util.ArrayList;
import java.util.List;
public class test01 {
public static void main(String[] args) {
Stock stock = new Stock();
Investor investor1 = new Investor("Alice");
Investor investor2 = new Investor("Bob");
Investor investor3 = new Investor("Charlie");
stock.registerObserver(investor1);
stock.registerObserver(investor2);
stock.registerObserver(investor3);
stock.setPrice(120.0f);
stock.removeObserver(investor2);
stock.setPrice(130.0f);
}
}
interface Observer{
void update(float price);
}
interface Subject{
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
class Stock implements Subject{
private List<Observer> observers ;
private float price;
public Stock(){
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for(Observer o: observers){
o.update(price);
}
}
public void setPrice(float price){
this.price = price;
notifyObservers();
}
}
class Investor implements Observer{
private String name;
public Investor(String name){
this.name = name;
}
@Override
public void update(float price) {
System.out.printf("%s: The stock price has changed to %.2f%n", name, price);
}
}
输出结果如下:
Alice: The stock price has changed to 120.00
Bob: The stock price has changed to 120.00
Charlie: The stock price has changed to 120.00
Alice: The stock price has changed to 130.00
Charlie: The stock price has changed to 130.00