设计模式(十)—— 观察者模式
Spring中的观察者模式
Spring实现发布-订阅的例子
定义一个事件
public class DemoEvent extends ApplicationEvent {
private String message;
public DemoEvent(Object source) {
super(source);
}
public DemoEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
定义一个对该事件的监听者A
@Component
public class DemoListener implements ApplicationListener<DemoEvent> {
private static final Logger LOGGER = LogManager.getLogger(ExternalProxyServiceImpl.class);
@Override
public void onApplicationEvent(DemoEvent event) {
String msg = event.getMessage();
LOGGER.info("我是蘑菇头,接收到的信息:" + msg);
}
}
定义一个对该事件的监听者B
@Component
public class Demo2Listener implements ApplicationListener<DemoEvent> {
private static final Logger LOGGER = LogManager.getLogger(ExternalProxyServiceImpl.class);
@Override
public void onApplicationEvent(DemoEvent event) {
String msg = event.getMessage();
LOGGER.info("我是熊猫头,接收到的信息:" + msg);
}
}
定义一个发布者
@Component
public class DemoPublisher {
@Autowired
ApplicationContext applicationContext;
public void publish(String message) {
applicationContext.publishEvent(new DemoEvent(this,message));
}
}
单元测试,测试结果
@SpringBootTest
@RunWith(SpringRunner.class)
public class EventTest {
@Autowired
private DemoPublisher demoPublisher;
@Test
public void test(){
demoPublisher.publish("观察者模式");
}
}
源码分析
事件监听者
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E var1);
}
事件发布者
@FunctionalInterface
public interface ApplicationEventPublisher {
default void publishEvent(ApplicationEvent event) {
this.publishEvent((Object)event);
}
void publishEvent(Object var1);
}
zookeeper中的观察者模式
参考文档
关于作者
后端程序员,五年开发经验,从事互联网金融方向。技术公众号「清泉白石」。如果您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。