设计模式学习笔记(3)——观察者模式

简介: 设计模式学习笔记(3)——观察者模式

为什么要用观察者模式

当对一个对象的改变需要同时改变其它对象,而且并不知道具体有多少个对象待改变。

举个例子:博客更新文章时,有哪些地方需要同步更新?

1. 个人文章统计总数+1
2. 个人积分数+n
3. 关注者消息推送+1
4. 分类推送添加..

如果这些更新需要以插件形式加载或移除,就可以利用观察者模式。也就是后期再增加或移除相关功能模块,不需要太多工作。

写法

观察者模式自己写的话比较复杂,我们有现成的可以用就尽量不要重复造轮子。

主要有2种实现方式:Guava的EventBus和Spring Event。个人认为Spring的更加强大,这里介绍Spring Event。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public  class User {
    private Integer userId;
    private String userName;
}
/**
 * <p color="orange">
 * 基础事件发布类
 * </p>
 *
 * @author BookSea
 * @date 2022/2/2 17:45
 */
public abstract class BaseEvent<T> extends ApplicationEvent {
    /**
     * 该类型事件携带的信息
     */
    private T eventData;
    /**
     *
     * @param source 最初触发该事件的对象
     * @param eventData 该类型事件携带的信息
     */
    public BaseEvent(Object source, T eventData) {
        super(source);
        this.eventData = eventData;
    }
    public T getEventData() {
        return eventData;
    }
}
public class UserEvent  extends BaseEvent<User>{
    public UserEvent(Object source, User user) {
        super(source,user);
    }
}
@Slf4j
@Service
public class UserListener {
    /*
     * @Async加了就是异步监听,没加就是同步
     * 可以使用@Order定义监听者顺序,默认是按代码书写顺序
     * 如果返回类型不为void,则会被当成一个新的事件,再次发布
     * @EventListener注解在EventListenerMethodProcessor类被扫描
     * 可以使用SpEL表达式来设置监听器生效的条件
     * 监听器可以看做普通方法,如果监听器抛出异常,在publishEvent里处理即可
     */
    //@Async
    @Order(1)
    @EventListener(condition = "#userEvent.getEventData().getUserName().equals('小明')")
    public String lister1(UserEvent userEvent){
       User user =userEvent.getEventData();
        System.out.println(user.toString());
        return "小米";
    }
    @Async
    @Order(2)
    @EventListener
    public void lister3(UserEvent userEvent){
        System.out.println("监听者2");
    }
    @Async
    @Order(3)
    @EventListener
    public void lister2(String name){
        System.out.println("我叫:"+name);
    }
}

使用的时候注入ApplicationEventPublisher然后将事件发布即可。

@Resource
private ApplicationEventPublisher applicationEventPublisher;
applicationEventPublisher.publishEvent(new UserEvent(this, new User(1, "小明")));

IDEA可以直接跳转到对应的监听器

目录
相关文章
|
11月前
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
136 3
|
10月前
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
5月前
|
设计模式 消息中间件 存储
【设计模式】【行为型模式】观察者模式(Observer)
一、入门 什么是观察者模式? 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
291 9
|
11月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
7月前
|
设计模式 消息中间件 存储
设计模式:观察者模式
观察者模式属于行为型设计模式,用于建立对象间的一对多依赖关系。当主题(Subject)状态变化时,所有依赖的观察者(Observer)会自动收到通知并更新。
|
11月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
180 6
|
11月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
91 1
|
11月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
77 3
|
12月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
86 9
|
12月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
84 2