创建观察者接口Observer,为所有的观察者定义一个接口,所有实现该抽象观察者的具体观察者在收到通知后都会进行对应的操作
public interface Observer {
public void testObserver();
}
创建被观察者接口Observerable,定义主题中可以执行的操作
public interface Observerable {
//添加观察者
public void registerObserver(Observer o);
//删除观察者
public void removeObserver(Observer o);
//通知所有观察者
public void notifyObserver();
}
创建TestObserver类来定义主题对象,主题对象中存储了该主题下的所有观察者,并提供增加和删除观察者的方法
@Component
public class TestObserver implements Observerable{
//保存该主题下所有的观察者
private List<Observer> list;
public TestObserver() {
list =new ArrayList<Observer>();
}
@Override
//添加观察者
public void registerObserver(Observer o) {
list.add(o);
}
@Override
//删除观察者
public void removeObserver(Observer o) {
if(!list.isEmpty()){
list.remove(o);
}
}
@Override
//通知所有观察者
public void notifyObserver() {
for(int i = 0; i < list.size(); i++) {
Observer oserver = list.get(i);
oserver.testObserver();
}
}
public void create() {
//消息更新,通知所有观察者
notifyObserver();
}
}
添加观察者1号
@Component
public class Listen1 implements Observer {
@Autowired
TestObserver testObserver;
@PostConstruct
public void init() {
//添加订阅Listen1
testObserver.registerObserver(this);
}
@Override
public void testObserver() {
//收到通知后,执行具体操作
System.out.println("Listen1.testObserver");
}
}
添加观察者2号
@Component
public class Listen2 implements Observer {
@Autowired
TestObserver testObserver;
@PostConstruct
public void init() {
//添加订阅Listen2
testObserver.registerObserver(this);
}
@Override
public void testObserver() {
//收到通知后,执行具体操作
System.out.println("Listen2.testObserver");
}
}
添加ApplicationRunnerImpl类继承ApplicationRunner接口,实现在启动SprootBoot项目后,执行主题发布操作
@Component
public class ApplicationRunnerImpl implements ApplicationRunner {
@Autowired
TestObserver testObserver;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("通过实现ApplicationRunner接口,在spring boot项目启动后进行注册");
//被观察者执行此方法,观察者只需要注册
testObserver.create();
}
}
执行流程:
在项目启动过程中,将主题对象及2个观察者对象实例化,同时将2个观察者存到主题对象中 项目启动后执行create方法,通过遍历所有添加的观察者,执行其重写的testObserver方法,以实现通知所有观察者功能 观察者在收到通知后,执行各自具体的业务
例子地址: https://gitee.com/UpUpJoyce/observer-demo.git