【设计模式】观察者(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();
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~