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也提供了注解的方式去实现。

经验分享 程序员 微信小程序 职场和发展