观察者模式的简单例子

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))来通知观察者事件发生。观察者实现类里对事件做出响应的业务逻辑处理。

posted on 2021-11-22 09:34  肥兔子爱豆畜子  阅读(236)  评论(0编辑  收藏  举报

导航