SpringBoot实践——观察者模式

1,985 阅读1分钟

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

定义:

观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个“观察” 该对象的其他对象。

实践需求:

消费者在系统留言后,需要系统站内信息通知下系统管理员、也需要用邮件通知下管理员

代码:

留言实体类:CustomerLeaveMessage.java

public class CustomerLeaveMessage implements Serializable {

   private static final long serialVersionUID = 1L;

   private String id;    // 主键

   private String name;      // 联系人

   private String phone;     // 联系电话

   private String email;     // 联系邮箱

   private String content;       // 留言内容

}

新建个Event,继承ApplicationEvent,里面传递个CustomerLeaveMessage参数,用于业务逻辑:

/**
 * @author 勤任风
 *  消费者 留言事件
 * @date 2021-07-16 14:26
 */
public class CustomerLeaveMessageEvent extends ApplicationEvent {

    public CustomerLeaveMessageEvent(CustomerLeaveMessage source) {
        super(source);
    }

}

此时,有两种方法来实现监听,一种是实现ApplicationListener接口,另一种是使用@EventListener实现注解

  1. 实现ApplicationListener接口

/**
 * 监听CustomerLeaveMessageEvent 事件后的逻辑
 * @author 勤任风
 * @date 2021-07-16 14:30
 */
@Slf4j
@Service
public class CustomerLeaveMessageEventService implements ApplicationListener<CustomerLeaveMessageEvent> {
    /**
     * 执行监听后的逻辑
     * @param customerLeaveMessageEvent
     */
    @Override
    @Async //异步
    public void onApplicationEvent(CustomerLeaveMessageEvent customerLeaveMessageEvent) {
        log.info(
                "用户留言后的逻辑响应,发送站内通知给管理员:{}",customerLeaveMessageEvent.toString()
        );

    }
}
  1. 通过注解@EventListener实现。

@Service
@Slf4j
public class CustomerLeaveMessageEventListener {
    @EventListener
    public void sendEmail(CustomerLeaveMessageEvent event){
        log.info("发送邮件给管理员");
    }
}

最终在service使用:

(1)注入ApplicationContext
@Autowired
private ApplicationContext applicationContext;
(2)然后在客户留言后面的逻辑追加该语句
applicationContext.publishEvent(new CustomerLeaveMessageEvent(customerLeaveMessage));