定义
当触发某些事件执行的时候,通知其他对象执行相关操作
优点
建立了一套触发机制
缺点
浪费时间
容易死循环
使用场景
项目初始化
歧义
mq是异步的
观察者模式是同步的
案例
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class Clock {
/**
* 建立一对多的关系
*/
private List<AbstractAction> list = new ArrayList<AbstractAction>();
/**
* 通知的对象有哪些
* @param action
*/
public void add(AbstractAction action){
list.add(action);
}
/**
* 时间到了通知各个对象
*/
public void notice(){
for (AbstractAction action : list) {
action.action();
}
}
}
/**
* 各个角色到了12点都要做个动作
*/
public abstract class AbstractAction {
public abstract void action();
}
public class Teacher extends AbstractAction{
@Override
public void action() {
System.out.println("老师下课了");
}
}
public class Student extends AbstractAction{
@Override
public void action() {
System.out.println("学生吃饭");
}
}
public class Aunt extends AbstractAction {
@Override
public void action() {
System.out.println("阿姨卖饭");
}
}
public class ObserverTest {
public static void main(String[] args) {
Clock clock = new Clock();
Teacher teacher = new Teacher();
Student student = new Student();
Aunt aunt = new Aunt();
clock.add(teacher);
clock.add(student);
clock.add(aunt);
clock.notice();
}
}
spring案例
ApplicationContext事件机制是观察者设计模式的实现,通过ApplicatonContext类和ApplicationListener接口,可以实现ApplicationContext事件处理
当容器中有ApplicationListener实现类时,每当ApplicationContext发布ApplicaitonEvent时,ApplicationListener的实现类将被自动触发
其中spring有一些内置事件,当完成魔种操作时会触发某些事件动作,比如监听ContextRefreshedEvent事件,当所有的bean都初始化完成并被成功装载后会触发该事件,实现ApplicationListener接口可以接收到监听动作
public class ApplicationLister implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent applicationEvent) {
System.out.println("spring容器初始化完成,你可以初始化你自己的数据啦");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="applicationLister" class="SpringObserver.ApplicationLister"></bean>
</beans>
public class SpringObserverTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("SpringObserverApplicationContext.xml");
}
}