【设计模式】浅析观察者模式

最近被一首歌曲给洗脑了,什么是快乐星球,什么是快乐星球,什么是快乐星球???

在这里插入图片描述
导致我最近学习的时候,就会出现快乐星球式的三段问。


什么是观察者模式?什么是观察者模式?到底什么是观察者模式?今天就一起研究研究,什么是观察者模式!

抛开定义来说说观察者模式

  • 课堂上老师宣布下课放学时,同学们纷纷离开教室回家。

  • 田径场上,裁判打枪后运动员们疾驰而出。

  • 城市道路上交通信号灯由红色变为绿色时,汽车行人有序开始通行。

可能你会问,这些跟我要学的观察者模式有什么关系吗?

在以上这些场景中,我们能看出,他们有一个共同点,当一个对象的状态发生改变时,其他的一些依赖于这个对象的对象们,也会发生变化。

没错,观察模式的简单定义即是如此!

观察者模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式

观察者模式结构图

在这里插入图片描述

结构图解读

从上面的结构图中,我们可以清晰的看到有五个部分组成

  • Subject 抽象目标
  • ConcreteSubject 具体目标
  • Observer 观察者接口
  • ConcreteObserve1 具体观察者1
  • ConcreteObserve2 具体观察者2

我们可以看出,抽象目标Subject中定义了对观察者的一些操作方法以及一个观察者集合。具体观察者实现Observer接口。其中的关系一目了然,如果你不能完全理解上面的结构图推荐你去回顾一下UML统一建模语言。【UML专栏

按照结构图编写代码

// Observer 接口
public interface Observer{
	// 观察者响应方法
	void response();
}
// 抽象目标类
public abstract class Subject{
	// 观察者集合
	protected List<Observer> observerList=new ArrayList<>();
	// 添加观察者
	public void addObserver(Observer o){
		observerList.add(o);
	}
	// 移除观察者
	public void removeObserver(Observer o){
		observerList.remove(o);
	}
	// 通知观察者
	public void notifyAllObservers(){};
}
// 具体观察者
public class ConcreteObserve1 implements Observer{
	// 实现响应的方法
	@Override
	public void response(){ 
		System.out.println("Rain say Hello");
	}
}
// 具体目标
public class ConcreteSubject extends Subject{
	@Override
    public void notifyAllObservers() {
        for (Observer o: observerList
             ) {
            o.response();
        }
    }
}

我们可以根据具体的场景去实现观察者模式。
在我们熟悉的spring框架中,已经为我们实现好了观察者模式,我们可以直接在spring中直接使用观察者模式。

spring中的观察者模式

在spring中观察者模式封装了四个角色

事件(ApplicationEvent)

ApplicationEvent 是所有事件对象的父类。ApplicationEvent 继承自 jdk 的 EventObject, 所有的事件都需要继承 ApplicationEvent, 并且通过 source 得到事件源。

事件监听(ApplicationListener)

ApplicationListener 事件监听器,也就是观察者。继承自 jdk 的 EventListener,该类中只有一个方法 onApplicationEvent。当监听的事件发生后该方法会被执行。

事件发布(ApplicationContext)

ApplicationContext 是 Spring 中的核心容器,在事件监听中 ApplicationContext 可以作为事件的发布者,也就是事件源。因为 ApplicationContext 继承自 ApplicationEventPublisher。在 ApplicationEventPublisher 中定义了事件发布的方法 — publishEvent(Object event)

事件管理(ApplicationEventMulticaster)

ApplicationEventMulticaster 用于事件监听器的注册和事件的广播。监听器的注册就是通过它来实现的,它的作用是把 Applicationcontext 发布的 Event 广播给它的监听器列表。

// 定义事件
@Component
public class MyEvent extends ApplicationEvent {
    public MyEvent(ApplicationContext source) {
        super(source);
        System.out.println("MyEvent 构造器执行~~~~~~");
    }
    public void sayHello(){
        System.out.println("业务方法执行~~~~~~~~");
    }
}
// 定义监听者
@Component
public class MyListenerA implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        System.out.println("监听者A收到通知~~~~~~~~");
        myEvent.sayHello();
    }
}
// 定义事件发布者

@Component
public class MyPublisher implements ApplicationContextAware {

    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext=applicationContext;
    }
    public void publisherEvent(MyEvent myEvent) {
        System.out.println("---开始发布 myEvent 事件---");
        applicationContext.publishEvent(myEvent);
    }

}
// 测试
    @Autowired
    private MyPublisher myPublisher;
    @Autowired
    private MyEvent myEvent;

    @Test
    public void main() {
        myPublisher.publisherEvent(myEvent);
    }

关于spring观察者模式更详细的分享在这里spring观察者详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LLLDa_&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值