a. 探寻观察者模式的奥义
观察者模式是一种行为设计模式,允许一个对象(被称为主题或可观察者)维护一个依赖对象列表(被称为观察者),当主题的状态发生变化时,所有观察者都会得到通知。观察者模式主要解决了对象之间的松耦合问题,使得一个对象的变化不会影响其他依赖它的对象。
b. 亲身体验:观察者模式实现
首先,我们需要创建一个主题接口,定义注册、注销和通知观察者的方法:
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
接下来,创建一个观察者接口,定义更新状态的方法:
public interface Observer {
void update(String message);
}
然后,实现主题接口,具体的主题类可以根据需求进行扩展:
public class ConcreteSubject implements Subject {
private List<Observer> observers;
private String message;
public ConcreteSubject() {
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(message);
}
}
public void setMessage(String message) {
this.message = message;
notifyObservers();
}
}
最后,实现观察者接口:
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received: " + message);
}
}
现在,我们可以创建主题和观察者实例,并将观察者注册到主题上:
public class Main {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setMessage("Hello, Observers!");
}
}
c. 优缺点探讨:观察者模式的影响
优点:
1、松耦合:主题和观察者之间的依赖关系减弱,使得它们可以独立地进行修改和扩展。
2、动态关联:可以在运行时动态地添加或删除观察者,提高了系统的灵活性。
缺点:
1、通知效率:当主题有大量观察者时,通知的过程可能会耗费较长时间可能引发无限循环:如果观察者和主题之间存在循环依赖,可能导致无限循环,需要特别注意处理。
d. 观察者模式在开源框架中的应用
观察者模式在许多开源框架和库中得到了广泛应用。以下是一些典型的例子:
Java内置观察者模式支持:Java自带了java.util.Observable类和java.util.Observer接口,可以直接使用它们来实现观察者模式。
Android框架中的LiveData:LiveData是一个数据持有类,允许在其数据发生变化时通知观察者。它在Android架构组件库中作为观察者模式的实现被广泛使用。
Spring框架中的ApplicationEvent和ApplicationListener:Spring框架使用ApplicationEvent和ApplicationListener来实现事件驱动的观察者模式。开发者可以通过自定义事件和监听器来实现松耦合的系统架构。
RxJava:RxJava是一个基于响应式编程的Java库,它实现了观察者模式,并提供了丰富的操作符来处理异步数据流。它广泛应用于Android、后端服务等场景。
总结:
观察者模式是一种非常实用的设计模式,它解决了对象之间的松耦合问题,使得一个对象的状态变化不会直接影响到其他依赖它的对象。在实际开发中,观察者模式可以帮助我们构建灵活、可扩展的系统。同时,也要注意观察者模式的一些缺点,并尽可能地进行优化。