模式是什么?模式是一个范式,一个在相同环境或者状况下的一种通用解决办法,解决方案。就好像孙子兵法,对于某种特定战局,战况下的一种派兵布阵策略和实施步骤的总结。模式需要什么呢?模式需要一个名字,一个问题域(要解决的问题),要有一个解决的方案,最后要达到什么样的结果。长话短说,Observer模式,所要解决的问题就是,一个事物,当它自身的状态改变了,那么它要通知其他的事物,而它又不能够事先知道要通知谁,只有在Runtime时才能知道。举个例子吧,钟表和人的关系就是这样,钟表自身的状态,也就是时刻改变了,它通知某些人,某些人看到或者听到后,会做出不同的行为。而钟表在商店里时,并不知道要通知谁?只有买主把钟表买回家,买主的家人注册到这个钟表,这时,钟表的状态改变才会通知到家里的人,那么家人有大人、小孩,他们看到或者听到这个钟表的时间改变,会有不同的行为。那么将上面的例子可以化解为对象。钟表是个源,它是抽象的概念,可以很多形式的表,手表、挂钟、闹钟等,而家人们都是监听器,实现了监听器接口,监听器方法就是listen()和see(),当人每个人实现了接口会有不同的行为,这些钟表并不关心,它只会在整点时通知之前注册到它内部的家人实例的监听器方法。那是什么时候注册的呢?就是主人买回家,告诉家人这是新的钟表,也就是Timer.registerListener(Listener l)那么钟表就是observable,就是那个常说的Subject,而家人就是具体的Observer,实现了Oberver接口的方法。
下面是Listner接口,是一个概念模型,提供给Timer,Timer只关心,自身改变状态后,要调用的观察者什么行为,并不关心观察者本身。所以提取人的若干行为,抽象成为接口。
这是一个主人的类,也就是一类具体的Observer。接口java.util.Observer和类java.util.Observable是Java本身对于观察者模式的支持。其实这种模式就是一种回调的应用,就是想其它类中注册自己的接口,到特定时候调用自己的方法。就好像古诗词中,“有朋自远方来不亦乐乎”,意思是说,如果好友光临到门口,叫一声自己,就会很高兴,也就是说,告诉朋友到达自己住处,这个状态满足,那么就叫一声自己,自己就会为朋友开门,高兴等行为就会进行。 如果不采用观察者模式,那就是自己需要不断的到门口察看朋友是否到了,是一种轮循的方式,当然也能达到效果,但会影响自己的事情。