【设计模式】观察者(Observer)模式

1.简介

观察者模式是行为型模式的一种,其本生代表着一种一对多(one to many)的关系:

当一个对象(目标对象)的状态发生改变时,所有依赖对象(观察者对象)都获得通知。

通常来讲,如果观察者对象过多或者通知一个观察者耗时太久,建议异步执行。同时,Java已经内置了观察者类/接口,可以继承。

2.特点

低耦合(loose coupling)
一对多(one to many)

3.例子

定义目标对象

@Data
@Component
class SendWeatherInfo extends Observable{
      
      private WeatherInfo weatherInfo;

      public void send(){
            this.setChanged(); //使用内置观察者接口,必须先调用此方法
            this.notifyObservers();
      }
}

定义观察者对象

@Component
@slf4j
public WeatherCompany implements Observer{
      private ExecutorService executorService = Executors.newFixedThreadPool(5);

      @Override
      public void update(Observable o, Object arg) {
            executorService.execute(()->{
                  if(o instanceof SendWeatherInfo){
                  log.info("notice!!")
                  }            

            }) 

      }


定义消息发送器

@Component
@EnableAsync
class MessageSender{
      @Autowried
      private SendWeatherInfo sendWeatherInfo; 
      @Autowried
      private WeatherCompany weatherCompany; 

      @Async
      public void sendMessage(WeatherInfo info){
            sendWeatherInfo.setWeatherInfo(info);
            sendWeatherInfo.addObserver(weatherCompany);
            sendWeatherInfo.send();
      }
}
}
posted @   LinM狂想曲  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示