深入浅出设计模式——观察者模式

苏凌峰

1.观察者模式介绍

2.用代码演示观察者模式

3.总结

4.在spring源码中,观察者模式的应用

1.观察者模式介绍

定义
定义一种对象之间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

2)简单地说,
观察者模式大都用于当某一个对象的状态改变,另外一个与之相关的对象也会发生变化,比如把代码传到固定分支上,然后系统自动部署,比如数据库新增一条订单信息,然后群消息自动收到订单提醒。

这两个功能有一个相似的地方,那就是每当一个状态发生改变的时候,另外一个对象也要随之改变,这种场景就适合使用观察者模式。

观察者模式的角色:

观察者:
观察者一般都是一个接口,它只有一个通知方法,在被观察者状态发生变化的视乎,这个方法就会被触发。

具体的观察者:
实现了观察者接口的观察者,是为了便于扩展,可以在角色中定义具体的业务逻辑,有点策略模式的味道。

具体的观察者:观察者接口的具体实现,在这个角色中,将定义被观察者对象状态发生变化时所要处理的逻辑。

被观察者:
一个接口类,可以定义抽象的方法,让子类实现逻辑。

具体的被观察者:
实现了被观察者的接口,可以在这里定义具体的业务逻辑。

2.用代码演示观察者模式

public interface IObserver {

     void update();

}

public class Observer implements IObserver{

    //可以是数据库查出来的List,然后当做参数丢到下面的函数里
    private List<IPeople> peopleList = new ArrayList<IPeople>();

    @Override
    public void update() {
        peopleList.stream().forEach(people->{
            people.execute();
        });
    }

}

public interface IPeople {

    void execute();

}


public class People implements IPeople{


    @Override
    public void execute() {

    }

}

3.总结

观察者模式其实是一种使用触发的方式,形成一条调用链,但是由于是链式调用,所以有时候常有性能问题。

4.在spring源码中,观察者模式的应用

在spring源码中, 观察者模式被进行了一次扩展,我们称之它为事件驱动:

image.png

执行过程:

1)事件源来发布不同的事件
2)当发布事件之后用多播器的方法进行事件的广播,由多播器去触发具体的监听器执行操作
3)监听器收到具体的事件之后,可以验证匹配是否处理当前事件,如果可以,直接处理,如果不行,不做任何操作

也就是说,

事件 = 引起这个调用链进行调用的原因

多播器 = 以前的遍历被观察者操作

监听器 = 被观察者

事件源 = 要执行的具体逻辑

我们来看看spring源码中是怎么处理这几个类的:

1)提前准备好N个事件
2)初始化多播器
3)准备好一系列监听器
4)向多波器中注册进去已有的监听器
5)准备事件发布,来通知多波器循环调用监听器进行相处理工作

github注释源码:
https://github.com/su15967456...

阅读 209

你的迷惑在于想得太多而书读的太少。

4 声望
7 粉丝
0 条评论
你知道吗?

你的迷惑在于想得太多而书读的太少。

4 声望
7 粉丝
文章目录
宣传栏