观察者模式的简单例子
Spring框架里边有很多Listener,对应的设计模式是观察者模式。所以写了一个小例子加深理解。
一共3个类,被观察对象,观察者接口,观察者实现
import java.util.ArrayList;
import java.util.List;
/**
* 被观察对象
* */
public class Subject {
private int state;
private List<Listener> listeners; //被观察对象持有观察者的引用
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllListeners();
}
public void addListener(Listener listener) {
if(null == listeners)
listeners = new ArrayList<>();
listeners.add(listener);
}
//通知观察者发生了事件
public void notifyAllListeners() {
for(Listener listener : listeners) {
listener.update(this);
}
}
public static void main(String[] args) {
Subject subject = new Subject();
Listener listener1 = new ListenerImpl();
subject.addListener(listener1);
subject.setState(1);
subject.setState(3);
}
}
观察者
/**
* listener监听器接口,也就是“观察者”
* */
public interface Listener {
public void update(Subject subject);
}
/**
* listener实现
* */
public class ListenerImpl implements Listener{
@Override
public void update(Subject subject) {
System.out.println(this.getClass().getName() + "监听到Subject变化事件, Subject state = " + subject.getState());
}
}
运行结果:
com.wangan.observer.ListenerImpl监听到Subject变化事件, Subject state = 1
com.wangan.observer.ListenerImpl监听到Subject变化事件, Subject state = 3
简单说明:通常被观察对象需要持有它的观察者的引用,然后当对象的某些事件发生的时候(例子中是setState()),通过调用观察者开放出来的接口方法(例子中的Listener.update(subject))来通知观察者事件发生。观察者实现类里对事件做出响应的业务逻辑处理。