当多个观察者同时订阅并观察同一个主题时,如果它们的执行顺序对于业务逻辑有影响,那么可能会出现不理想的执行顺序。以下是一种解决方法:
import java.util.ArrayList;
import java.util.List;
public class Observable {
private List observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public interface Observer {
void update();
}
public class ConcreteObserver implements Observer, Comparable {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update() {
System.out.println(name + " is being notified.");
}
@Override
public int compareTo(ConcreteObserver other) {
// 根据期望的执行顺序进行比较,返回负数表示当前观察者先于other执行,返回正数表示当前观察者后于other执行,返回0表示执行顺序相同
// 可根据具体的业务逻辑进行比较
return name.compareTo(other.name);
}
}
import java.util.Collections;
public class Observable {
private List observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
// 添加观察者后,按照观察者的比较顺序重新排序
Collections.sort(observers);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
这样,当主题通知观察者时,观察者将按照期望的执行顺序进行执行。