定义:
观察者模式是定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。观察者模式是一种对象行为模式。
思路要点:
1.观察者(订阅者)
2.被观察者(发布者)
3.注册(订阅)
既然有观察者,那肯定有被观察者,观察者模式就是让观察者及时的知道被观察者某个值或者某个状态发生了变化,从而让自己值或者状态实时更新。观察者和被观察者是通过注册这个操作来产生关系。
举例:
订牛奶场景:小时候家里订牛奶,每天送牛奶的人员会在固定时间将牛奶送到家门口的牛奶箱里面。我们喝牛奶只需要在家门口的牛奶箱里面拿牛奶即可。
这样一来,牛奶配送公司(被观察者)就需要有三个方法,和一个集合(List<Observer> 观察者集合)
第一个方法订牛奶(Register(object obj))
第二个方法送牛奶(SeedMsg(object obj,delegate callback))
第三个方法取消订牛奶(CancelRegister(object obj))
首先,喝牛奶的人(观察者)需要到牛奶配送公司(被观察者)去订牛奶(注册),牛奶配送公司会将观察者的信息记录到配送清单里面(观察者集合)。
然后到了固定的时间(被观察者的值发生变化的时候),牛奶配送公司(被观察者)会把牛奶(变化的值)送到(调用SeedMsg方法)喝牛奶人(被观察者)的牛奶箱里面。
如果不想再继续喝牛奶了(不再需要这些变化的数据),可以取消牛奶的订阅(注销订阅)。
实际开发过程中会把被观察者和观察者分别抽象成一个接口,在注册的时候同时会将观察者信息和观察者的回调函数传给被观察者的注册方法里面,并且被观察者会将注册信息放在数据库或者缓存中间件里面。在通知的时候被观察者会从数据库或者缓存中间件里面拿到观察者的注册信息,并挨个通知,通知完毕后会将已通知对象从属性集合中删除。下次通知的时候会重新从数据库或者缓存中间件里面取列表数据。当不再需要通知的时候,就调用取消订阅方法,再被观察者的通知列表中移除观察者对象即可。
如果不使用观察者模式,通常我们会通过定时轮询的方式去获取这些变化的数据。比如没有牛奶配送公司,那么我们想喝牛奶的时候就需要自己到牛奶销售点(被观察者开放数据查询方法)去购买(主动调用被观察者数据查询方法),如果牛奶还没有到(数据未发生变化),那么需要等一段时间(定时轮询)再来购买(再次调用查询方法),直到购买到牛奶(拿到变化后的数据)或者放弃购买(取消订阅)。