原则:
依赖倒转,程序应该都依赖抽象,而不是依赖具体,从而使得各自的变化不会影响到另一边的变化。
What?
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
理解:
挨个通知消息
我们假想一下,如果米老师有消息要通知大家,他可以采取一种方式是:让我们把全部学生的名单告诉他,然后老师会挨个通知我们,老师会依赖与我们每一个学生,如果再新来几个同学,老师还要再去更新我们的名单,这样的工作量明显是很大的,如图一。
公告的引入:
我们有没有更简单高效的方法呢?当然有了,那就是公告的作用,我们都见过老师会在公告里发布消息,老师不需要知道我们是谁,他只需要在公告里发布消息就可以了,所以老师不会依赖与我们每个学生,我们学生人数增多或减少,对老师没有影响,因为他不需要要我们的名单。而我们每个人只需要做的就是打开自己的今目标,关注公告里的消息就可以了,所以我们也不依赖老师,米老师发布的消息我们可以看,孙老师,其他的任何老师发布的消息我们都能看。我们就是观察者,监听公告里的消息,当公告里有新消息时,我们会采取行动做公告里要求我们做的事情。如图二所示:
图一:
图二:
观察者模式结构图:
Subject类:
抽象通知者,当具体通知者发生变化时,观察者不会发生变化,观察者不需要只是具体通知者是谁,就像我们看到公告里有消息时,自动会点开阅读,不用去管是米老师发的,还是孙老师发的消息,我们去执行就可以了。
Observer类:
抽象类,定义了一个接口,方法Update方法,当接到通知时,会要求相应的子类更新自己。相当于当我们发现公告里有新消息时,会去看里面相应的消息。
什么时候使用?
当一个对象的改变需要同时改变其他对象的时候,即一方面依赖与另一方面,我们不希望这样,这时我们会引入观察这模式,定义抽象类和接口,然耦合双方都依赖与抽象,而不是依赖与具体,从而使各自的变化不会影响到另一边的变化。
总结
观察者模式就是通过定义抽象类,让某一面具体的类依赖另一面抽象的类,从而使一面的改变不会影响到另一面的对象。
观察者模式有什么不足?以及如何改进?下次再见,期待您的阅读。。。