【筹划模式】观察者模式

[复制链接]
发表于 2025-12-30 03:38:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、什么是观察者模式

概念:


  • 观察者模式(Observer Pattern)是一种举动型筹划模式,它界说了一种一对多的依靠关系, 一是指主题对象,多是指观察者对象,观察者对象监听主题对象的状态变革。当主题对象改变时,对应的观察者对象就会收到关照并更新自身。
脚色构成:


  • Subject(主题):即被观察者,它是一个抽象类或接口,界说了注册和取消观察者对象的方法,以及关照观察者的方法。
  • ConcreteSubject(详细主题):实现了主题接口,它具有添加、删除和关照观察者的功能,当其内部状态发生改变时,会关照全部注册的观察者。
  • Observer(观察者):也称为订阅者或监听者,它是一个抽象类或接口,界说了观察者吸取关照并更新自身的方法。
  • ConcreteObserver(详细观察者):实现了观察者接口,收到主题的关照即会实验相应操纵,以便与主题保持同等。
二、观察者模式的长处


  • 解耦:主题和观察者独立封装,主题对象不必要知道观察者的详细实现,只必要通过观察者接口举行通讯。
  • 可扩展性:一个观察者对象的增编削不会影响其他对象通讯,主题对象也不消修改代码,符合开闭原则。
  • 关照机制:主题对象的状态发生改变时,会自动关照全部注册的观察者对象,即实现了对象间的动态通讯。
  • 易于维护:观察者模式的结构清晰,代码可读性好,每个脚色的功能单一,易于明确和维护。
  • 代码复用:由于观察者模式解耦了主题和观察者对象,使得它们可以被独立地复用,不必要修改原有的代码。
总之,观察者模式是一种机动、可扩展且可维护的筹划模式,实用于一对多的通讯场景,常见于变乱驱动的体系筹划、图形界面框架、消息队列等场景中。
三、观察者模式的应用场景


  • 必要关照时:当一个对象的状态改变必要关照其他对象,而且不知道关照的对象是谁时,可以利用观察者模式。比方,一个主题对象(被观察者)的状态变革必要关照多个观察者对象,比如电商平台上商品代价变革关照用户。
  • 必要解耦时:一个对象必要将自己的状态变革关照给其他对象,而且不关心其他对象的详细实现时,可以利用观察者模式。比方,一个发布者将消息发布给多个订阅者,而发布者不必要关心每个订阅者的处理惩罚方式。
  • 一对多依靠时:一个对象的改变会影响其他多个对象时,可以利用观察者模式。比方,一支股票的代价变革会影响到全部生意业务者的决议。
示例:消息订阅体系
假设有一个消息发布者(被观察者)和多个消息订阅者(观察者)。当消息发布者发布一条消息时,全部订阅者都会收到关照并更新自己的消息列表。这个标题可以利用观察者模式来办理。
在该示例中,消息发布者是主题对象,消息订阅者是观察者对象。消息发布者可以注册和删除订阅者,而且在发布消息时会关照全部订阅者。订阅者可以更新自己的消息列表。
通过利用观察者模式,消息发布者和订阅者对象之间解耦,实现了一对多的通讯机制,同时也方便了消息发布者的扩展和维护。
四、观察者模式的Java实现

在Java中,可以通过以下步调来实现观察者模式:

  • 界说观察者接口(Observer):观察者接口中声明确更新方法,用于在被观察者状态变革时举行关照。
  1. public interface Observer {
  2.     void update();
  3. }
复制代码

  • 界说被观察者接口(Subject):被观察者接口中声明确添加、删除和关照观察者的方法。
  1. public interface Subject {
  2.     void registerObserver(Observer observer);
  3.     void removeObserver(Observer observer);
  4.     void notifyObservers();
  5. }
复制代码

  • 实现观察者类(详细观察者):详细观察者类实现了观察者接口,并实现了更新方法。
  1. public class ConcreteObserver implements Observer {
  2.     @Override
  3.     public void update() {
  4.         // 执行更新操作
  5.     }
  6. }
复制代码

  • 实现被观察者类(详细被观察者):详细被观察者类实现了被观察者接口,并维护了观察者列表,实现了添加、删除和关照观察者的方法。
  1. public class ConcreteSubject implements Subject {
  2.     private List<Observer> observers = new ArrayList<>();
  3.     @Override
  4.     public void registerObserver(Observer observer) {
  5.         observers.add(observer);
  6.     }
  7.     @Override
  8.     public void removeObserver(Observer observer) {
  9.         observers.remove(observer);
  10.     }
  11.     @Override
  12.     public void notifyObservers() {
  13.         for (Observer observer : observers) {
  14.             observer.update();
  15.         }
  16.     }
  17. }
复制代码

  • 利用观察者模式:在现实应用中,可以创建详细观察者和详细被观察者对象,然后将观察者注册到被观察者中,并在必要的时间调用被观察者的关照方法。
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         ConcreteSubject subject = new ConcreteSubject();
  4.         ConcreteObserver observer1 = new ConcreteObserver();
  5.         ConcreteObserver observer2 = new ConcreteObserver();
  6.         
  7.         subject.registerObserver(observer1);
  8.         subject.registerObserver(observer2);
  9.         
  10.         // 状态变化后通知观察者
  11.         subject.notifyObservers();
  12.     }
  13. }
复制代码
以上,我们就完成了观察者模式的Java示例。在详细的应用场景中,可以根据必要扩展、修改和定制观察者模式的实现。
五、SpringBoot中观察者模式的实现

在Spring Boot中,可以利用Spring框架中的变乱机制来实现观察者模式。Spring的变乱机制基于观察者模式,通过发布-订阅模子实现。
实现Spring Boot中观察者模式的步调如下:

  • 界说变乱类:创建一个继承自ApplicationEvent的自界说变乱类。
  1. public class CustomEvent extends ApplicationEvent {
  2.     public CustomEvent(Object source) {
  3.         super(source);
  4.     }
  5.    
  6.     // 可以定义一些自定义的属性和方法
  7. }
复制代码

  • 界说观察者类:创建一个实现ApplicationListener接口的观察者类。
  1. @Component
  2. public class CustomEventListener implements ApplicationListener<CustomEvent> {
  3.     @Override
  4.     public void onApplicationEvent(CustomEvent event) {
  5.         // 在事件发生时,执行相应的逻辑
  6.     }
  7. }
复制代码

  • 发布变乱:在必要的地方通过ApplicationContext来发布自界说变乱。
  1. @Autowired
  2. private ApplicationContext applicationContext;
  3. public void publishEvent() {
  4.     CustomEvent event = new CustomEvent(this);
  5.     applicationContext.publishEvent(event);
  6. }
复制代码
通过上述步调,我们就可以在Spring Boot中实现观察者模式。当发布自界说变乱时,全部订阅该变乱的观察者都会收到关照并实验相应的逻辑。可以根据必要在观察者类中举行逻辑处理惩罚,比方发送关照、更新数据等操纵。
必要注意的是,在利用Spring的变乱机制时,观察者类必要被Spring容器管理,可以通过@Component注解大概其他方式将观察者类注入到容器中。别的,发布变乱的类必要通过@Autowired大概其他方式获取ApplicationContext来发布变乱。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表