设计模式-观察者模式-基于Spring设计思想扩展使用

观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

介绍

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

ApplicationListener接口作用——监听事件

Spring内置事件

1、ContextRefreshedEvent

ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext接口中使用 refresh() 方法来发生。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用

2、ContextStartedEvent

当使用 ConfigurableApplicationContext (ApplicationContext子接口)接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序

3、ContextStoppedEvent

当使用 ConfigurableApplicationContext 接口中的 stop() 停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作

4、ContextClosedEvent

当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启

5、RequestHandledEvent

这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。只能应用于使用DispatcherServlet的Web应用。在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件

使用

需求:订单创建成功后,需要进行短信通知、App通知、微信通知等。。

创建事件

import org.springframework.context.ApplicationEvent;

//订单创建事件
public class OrderEvent extends ApplicationEvent {
    public OrderEvent(Object source) {
        super(source);
    }
}

监听事件

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class SmsListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(OrderEvent orderEvent) {
        System.out.println("短信通知!!!!!");
    }
}
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class WXListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(OrderEvent orderEvent) {
        System.out.println("微信通知!!!!!");
    }
}
@Component
public class OtherListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(OrderEvent orderEvent) {
        System.out.println("其他通知!!!!!");
    }
}

service实现

@Service
public class OrderService {

    @Autowired
    ApplicationContext applicationContext;

    public void createOrder(){
        System.out.println("订单创建成功!!");
        System.out.println();

        //订单事件
        OrderEvent orderEvent = new OrderEvent("参数");

        //发布事件
        applicationContext.publishEvent(orderEvent);
    }
}

测试

    @Autowired
    OrderService orderService;

    @Test
    public void create() {
        orderService.createOrder();
    }

 

你可能感兴趣的:(设计模式,Spring)