窃听风云 观察者模式

2019-03-14  本文已影响0人  NazgulSun

观察模式,其实是用的非常多的模式,

实现sub-pub的核心模式,比如消息队列。

该模式的代码核心逻辑就是 要有一个 observable 和一个 observer

observable顾名思义就是 说我可以被人观察,这样的一个对象,那么必然会提供注册的接口,

想要观察我的人,赶紧注册,然后有个notify方法,你注册了我有事就会通知。

对于一个 observer 对象,那么就需要有一个 update 方法, 意识就是 你有事调用这个方法,相当于留下了联系方式。

在java的jdk中,目前已经有 Observable 和observer的现实实现, 还有一个类似的模式就是Event 和EventListener模式。

其中Event和EventListner模式 和观察者模式大同小异,但似乎大家用 事件 监听模式更多,下面以spring 的例子作为详细解答。

spring context  是一个可以被监听的对象,他可以向listener发布各种各样的事件信息。

实现 listener有两种方法, 注解和实现接口。

基于注解:

@Component

public class AnnotationRegisterListener {

    /**

    * 注册监听实现方法

    * @param userRegisterEvent 用户注册事件

    */

    @EventListener

    public void register(UserRegisterEvent userRegisterEvent)

    {

        System.out.println("@EventListener注册信息,用户名:"+user.getName()+",密码:"+user.getPassword());

    }

}

基于接口:

@Component

public class RegisterListener implements ApplicationListener<UserRegisterEvent>

{

    /**

    * 实现监听

    * @param userRegisterEvent

    */

    @Override

    public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {

        System.out.println("注册信息,用户名:"+user.getName()+",密码:"+user.getPassword());

    }

}

发布事件,使用applicationcontext publish方法

@Service

public class UserService

{

    @Autowired

    ApplicationContext applicationContext;

    public void register(UserBean user)

    {

        applicationContext.publishEvent(new UserRegisterEvent(this,user));

    }

}

目前spring的publish事件中,listener监听的顺序是不保证的,同时事件的处理是同步的。

如果要实行按顺序的事件监听,需要实现SmartApplicationListener,如果想要异步,可以使用

spring的@Async实现异步监听,在这里省略。

上一篇下一篇

猜你喜欢

热点阅读