马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、什么是观察者模式
概念:
- 观察者模式(Observer Pattern)是一种举动型筹划模式,它界说了一种一对多的依靠关系, 一是指主题对象,多是指观察者对象,观察者对象监听主题对象的状态变革。当主题对象改变时,对应的观察者对象就会收到关照并更新自身。
脚色构成:
- Subject(主题):即被观察者,它是一个抽象类或接口,界说了注册和取消观察者对象的方法,以及关照观察者的方法。
- ConcreteSubject(详细主题):实现了主题接口,它具有添加、删除和关照观察者的功能,当其内部状态发生改变时,会关照全部注册的观察者。
- Observer(观察者):也称为订阅者或监听者,它是一个抽象类或接口,界说了观察者吸取关照并更新自身的方法。
- ConcreteObserver(详细观察者):实现了观察者接口,收到主题的关照即会实验相应操纵,以便与主题保持同等。
二、观察者模式的长处
- 解耦:主题和观察者独立封装,主题对象不必要知道观察者的详细实现,只必要通过观察者接口举行通讯。
- 可扩展性:一个观察者对象的增编削不会影响其他对象通讯,主题对象也不消修改代码,符合开闭原则。
- 关照机制:主题对象的状态发生改变时,会自动关照全部注册的观察者对象,即实现了对象间的动态通讯。
- 易于维护:观察者模式的结构清晰,代码可读性好,每个脚色的功能单一,易于明确和维护。
- 代码复用:由于观察者模式解耦了主题和观察者对象,使得它们可以被独立地复用,不必要修改原有的代码。
总之,观察者模式是一种机动、可扩展且可维护的筹划模式,实用于一对多的通讯场景,常见于变乱驱动的体系筹划、图形界面框架、消息队列等场景中。
三、观察者模式的应用场景
- 必要关照时:当一个对象的状态改变必要关照其他对象,而且不知道关照的对象是谁时,可以利用观察者模式。比方,一个主题对象(被观察者)的状态变革必要关照多个观察者对象,比如电商平台上商品代价变革关照用户。
- 必要解耦时:一个对象必要将自己的状态变革关照给其他对象,而且不关心其他对象的详细实现时,可以利用观察者模式。比方,一个发布者将消息发布给多个订阅者,而发布者不必要关心每个订阅者的处理惩罚方式。
- 一对多依靠时:一个对象的改变会影响其他多个对象时,可以利用观察者模式。比方,一支股票的代价变革会影响到全部生意业务者的决议。
示例:消息订阅体系
假设有一个消息发布者(被观察者)和多个消息订阅者(观察者)。当消息发布者发布一条消息时,全部订阅者都会收到关照并更新自己的消息列表。这个标题可以利用观察者模式来办理。
在该示例中,消息发布者是主题对象,消息订阅者是观察者对象。消息发布者可以注册和删除订阅者,而且在发布消息时会关照全部订阅者。订阅者可以更新自己的消息列表。
通过利用观察者模式,消息发布者和订阅者对象之间解耦,实现了一对多的通讯机制,同时也方便了消息发布者的扩展和维护。
四、观察者模式的Java实现
在Java中,可以通过以下步调来实现观察者模式:
- 界说观察者接口(Observer):观察者接口中声明确更新方法,用于在被观察者状态变革时举行关照。
- public interface Observer {
- void update();
- }
复制代码
- 界说被观察者接口(Subject):被观察者接口中声明确添加、删除和关照观察者的方法。
- public interface Subject {
- void registerObserver(Observer observer);
- void removeObserver(Observer observer);
- void notifyObservers();
- }
复制代码
- 实现观察者类(详细观察者):详细观察者类实现了观察者接口,并实现了更新方法。
- public class ConcreteObserver implements Observer {
- @Override
- public void update() {
- // 执行更新操作
- }
- }
复制代码
- 实现被观察者类(详细被观察者):详细被观察者类实现了被观察者接口,并维护了观察者列表,实现了添加、删除和关照观察者的方法。
- public class ConcreteSubject implements Subject {
- private List<Observer> 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();
- }
- }
- }
复制代码
- 利用观察者模式:在现实应用中,可以创建详细观察者和详细被观察者对象,然后将观察者注册到被观察者中,并在必要的时间调用被观察者的关照方法。
- public class Main {
- public static void main(String[] args) {
- ConcreteSubject subject = new ConcreteSubject();
- ConcreteObserver observer1 = new ConcreteObserver();
- ConcreteObserver observer2 = new ConcreteObserver();
-
- subject.registerObserver(observer1);
- subject.registerObserver(observer2);
-
- // 状态变化后通知观察者
- subject.notifyObservers();
- }
- }
复制代码 以上,我们就完成了观察者模式的Java示例。在详细的应用场景中,可以根据必要扩展、修改和定制观察者模式的实现。
五、SpringBoot中观察者模式的实现
在Spring Boot中,可以利用Spring框架中的变乱机制来实现观察者模式。Spring的变乱机制基于观察者模式,通过发布-订阅模子实现。
实现Spring Boot中观察者模式的步调如下:
- 界说变乱类:创建一个继承自ApplicationEvent的自界说变乱类。
- public class CustomEvent extends ApplicationEvent {
- public CustomEvent(Object source) {
- super(source);
- }
-
- // 可以定义一些自定义的属性和方法
- }
复制代码
- 界说观察者类:创建一个实现ApplicationListener接口的观察者类。
- @Component
- public class CustomEventListener implements ApplicationListener<CustomEvent> {
- @Override
- public void onApplicationEvent(CustomEvent event) {
- // 在事件发生时,执行相应的逻辑
- }
- }
复制代码
- 发布变乱:在必要的地方通过ApplicationContext来发布自界说变乱。
- @Autowired
- private ApplicationContext applicationContext;
- public void publishEvent() {
- CustomEvent event = new CustomEvent(this);
- applicationContext.publishEvent(event);
- }
复制代码 通过上述步调,我们就可以在Spring Boot中实现观察者模式。当发布自界说变乱时,全部订阅该变乱的观察者都会收到关照并实验相应的逻辑。可以根据必要在观察者类中举行逻辑处理惩罚,比方发送关照、更新数据等操纵。
必要注意的是,在利用Spring的变乱机制时,观察者类必要被Spring容器管理,可以通过@Component注解大概其他方式将观察者类注入到容器中。别的,发布变乱的类必要通过@Autowired大概其他方式获取ApplicationContext来发布变乱。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |