我想使用没有Spring事件的Spring Boot实现GoF Observer设计模式。
代码示例:
@Component
public class MyObservable extends java.util.Observable {
void myObservableMethod(Object obj){
notifyObservers(obj);
}
}
@Component
public class MyObserver implements java.util.Observer{
@Override
public void update(java.util.Observable observable, Object obj) {
System.out.println(obj.toString());
}
}
如何使用observable注册观察者,并且仍能使用Spring Depedency Injection? 我可以在哪里调用myObserver.accept(myObservable); ?
@Autowired
MyObservable myObservable;
@Autowired
MyObserver myObservable;
myObserver.accept(myObservable); //??
答案 0 :(得分:1)
java.util类是该模式的一个很好的实现吗?
GoF模式及其java实现有点过时并存在一些问题 这实际上取决于您要解决的问题,但如果您的应用程序没有大量使用事件而您不想引入类似spring事件或RxJava的内容,那么它可能是合适的。
如何使用observable注册观察者,并且仍然可以 使用Spring Depedency Injection?在哪里我可以打电话 myObserver.accept(myObservable); ?
请参阅下面的示例,了解如何定义Observable的一些观察者,连接它们并最终向它们发送一些事件。
@SpringBootApplication
public class ObserverApplication {
public static void main(String[] args) {
try(ConfigurableApplicationContext ctx = SpringApplication.run(ObserverApplication.class, args)){
Observable observable = ctx.getBean(Observable.class);
observable.notifyObservers("Hello");
}
}
@Bean
public Observable myObservable(){
return new MyObservable();
}
@Bean
MyObserver observer1(){
return new MyObserver(1);
}
@Bean
MyObserver observer2(){
return new MyObserver(2);
}
@Autowired
public void configureObservers(Observable myObservable, MyObserver observer1, MyObserver observer2){
myObservable.addObserver(observer1);
myObservable.addObserver(observer2);
}
static class MyObserver implements Observer {
int id;
public MyObserver(int id) {
this.id = id;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer: " + id + ", Received object: " + arg);
}
}
static class MyObservable extends Observable {
@Override
public void notifyObservers(Object arg){
this.setChanged();
super.notifyObservers(arg);
}
}
}