介绍
观察者模式的使用场景非常广泛,小到代码层面的解耦,达到架构层面的系统解耦,再或者到一些产品的设计思路,都有这种模式的影子。
现在我们常说的基于事件驱动的架构,其实也是观察者模式的一种最佳实践。当我们观察某一个对象时,对象传递出的每一个行为都被看成是一个事件,观察者通过处理每一个事件来完成自身的操作处理。
生活中也有许多观察者模式的应用,比如,汽车和红绿灯的关系,‘红灯停,绿灯行’,在这个过程中交通信号灯是汽车的观察目标,而汽车是观察者。
观察者模式(observer pattern)的原始定义是:定义对象之间的一对多关系,这样当一个对象改变状态时,它的所有依赖项都会自动得到通知和更新。
在观察者模式中发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
观察者模式的别名有发布-订阅(Publish/Subscribe)模式,模型-视图(Model-View)模式、源-监听(Source-Listener)模式等。
结构图
抽象依赖于抽象,不让具体类之间产生依赖关系
案例代码
如果我们要实现一个买房摇号的程序,需要通过短信告知用户摇号结果,还需要向MQ中保存用户本次摇号的信息。
未使用观察者模式的代码如下
/**
* @Description: 开奖服务接口
* @author: zhuoyue
* @since: 2024/05/14 19:40
*/
public interface LotteryService {
/**
* 开奖之后的业务操作
* @param uId
* @return
*/
public LotteryResult lottery(String uId);
}
public class LotteryServiceImpl implements LotteryService {
//注入摇号服务
private DrawHouseService houseService = new DrawHouseService();
@Override
public LotteryResult lottery(String uId) {
//1.摇号
String result = houseService.lots(uId);