Java之设计模式:(四)观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
基于javaAPI实现:
/**
* 观察者模式(基于java API)
* https://blog..net/sun_shaoping/article/details/84067446
*
* @author qy
* @since 2022/7/20 9:44
*/
public class ObserverPattern {
public static class SmsObserver implements Observer {
private final Observable observable;
public SmsObserver(Observable observable) {
this.observable = observable;
this.observable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
System.out.println("短信提示: " + "===>" + arg.toString());
}
}
public static class EmailObserver implements Observer {
private final Observable observable;
public EmailObserver(Observable observable) {
this.observable = observable;
this.observable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
System.out.println("邮箱提示: " + "===>" + arg.toString());
}
}
public static class MyObservable extends Observable {
public MyObservable() {
setChanged();
}
}
public static void main(String[] args) {
Observable observable = new MyObservable();
new SmsObserver(observable);
new EmailObserver(observable);
observable.notifyObservers("欢迎订购XXX服务");
}
}
执行main方法,控制台显示:
基于Spring实现
使用用户注册成功后,发送消息为例:
UserRegisterEvent.java
public class UserRegisterEvent extends ApplicationEvent {
/**
* 用户名
*/
private String username;
public UserRegisterEvent(Object source) {
super(source);
}
public UserRegisterEvent(Object source, String username) {
super(source);
this.username = username;
}
public String getUsername() {
return username;
}
}
UserService.java
@Slf4j
@Service
public class UserService implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
public void register(String username) {
// ... 执行注册逻辑
log.info("[register][执行用户({}) 的注册逻辑]", username);
// 注册成功通知
applicationEventPublisher.publishEvent(new UserRegisterEvent(this, username));
}
}
EmailService.java
@Slf4j
@Service
public class EmailService implements ApplicationListener<UserRegisterEvent> {
@Override
@Async // 可以添加此注解,使用异步,建议指定线程池name
public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
log.info("用户注册成功。发送邮箱消息,username:{}" , userRegisterEvent.getUsername());
}
}
SmsService.java
@Slf4j
@Service
public class SmsService implements ApplicationListener<UserRegisterEvent> {
@Override
@Async // 可以添加此注解,使用异步,建议指定线程池name
public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
log.info("用户注册成功。发送短信消息,username:{}" , userRegisterEvent.getUsername());
}
}
接口测试:
@Autowired
private UserService userService;
@GetMapping("/user/register")
public String userRegister(@RequestParam String username) {
userService.register(username);
return "ok";
}
结果:
当然,spring也提供了注解的方式去实现。
