观察者模式(Observer)
Observer模式的功用,是希望两个(或多个)对象,我们称之为Subject和Observer,当一方的状态发生改变的时候,另一方能够得到通知。也就是说,作为Observer的一方,能够监视到Subject的某个特定的状态变化,并为之做出反应。一个简单的例子就是:当一个用户视图中的数据被用户改变后,后端的数据库能够得到更新,而当数据库被其他方式更新后,用户视图中的数据显示也会随之改变。
目的:当自己关心的对象的状态发生改变以后,你可以获得这种改变,举个简单的例子吧!
场景一:
比如你最近对机票的价格感兴趣,想买一张价格比较合适的机票,你可以每天跑去卖机票的地方,或者去航空公司的官网查看机票的价格,只要价格一合适你就会付款来购买,使得自己可以买到价格优惠的机票,单这个是很烦人的一件事情,你必须要过几个小时或者每天要主动去了解一下机票的价格,以至于让你觉得很难受!不是吗?
那么对于这样的情况我们是不是可以想想另外的一种办法呢,比如,我们给买票的地方留一个电话,告诉他当机票的价格下降时,你通知我,现在你只要在家躺着等电话就行了,或者给你订阅航空公司网站的相关航班信息到你的手机上,每天以短信的形式通知你,这样是不是就方便多了!呵呵,,
以上就是一个观察者模式的应用场景,现实生活中Observer模式运用的地方比比皆是,只要你留心注意观察,一定可以发现更多哦!甚至你还有可能发现别人没有发现的!程序源于生活,服务生活!
好的,下面我们就进入正题详细的来讨论一下观察者模式,以订阅者的关系为列:subject(主题),observer(订阅者);也有人这样描述:主题+订阅者=观察者模式,此处我们用订阅者而不用观察者,是担心给读者引起误解,和观察者模式混淆,起了以偏概全的恶果罢了!
你想要看人民日报的报纸,关心世界上发生的事情,你可以到报社定一份报纸,以后由专人每天送到你的家里面,而你不用每天都去报亭买,而且你只用订阅一次,以后每天都会有报纸看,如果你不想看了可以到报社告诉他们你对他们的报纸不感兴趣了,不要了,以后报纸也就不会送达到你家里.不当你可以这么做,每个想看报纸的人都可以这样!
主题和订阅者之间的关系是:一对多的映射关系,由主题来维护这种关系,如图:
Java中有自己实现的观察者模式,咱我们先不研究,我们先根据自己的需求实现一个,然后再和api中的对比,看看有哪些优劣,先透露一点,别太高看api哦!呵呵,,,
先看一下类图:
设计原则:面向接口编程,而不要面向实现编程,对扩展开发,对修改关闭,要实现这些我们就必须要面向接口编程,
从类图上来看,我们设计了Subject一个超类,抽像了最基本的方法,而具体的实现则放在子类中来做,假设你有一个新的主题,你只要实现Subject就可以,同理,我们也写了一个订阅者的超类,如果你让成为订阅者,只要实现超类Oberser即可。
实现逻辑过程:当有一个新的订阅者想要订阅主题时,可以将自己注册到subject上,调用Subject的registerObservser(Observer observer),参数为订阅者的抽象类,记住:在具体的代码实现中尽量不要有具体的类的类型,当订阅成功以后, Subject就会向其订阅了的对象发送他们想要的消息,此处订阅者对象你可以将其保存在全局的List<Observer> observerList = newArrayList<Observser>();中,jdk的订阅者对象是保存在vector中的,因为其实线程安全的,然后通过主题的notifyObservers()对象来通知具体的订阅者,调用订阅者的:update()方法,
就可以实现订阅一次以后当主题有什么变化会自动通知,订阅者,读者可以根据我以上将的自己完成具体的代码的实现和写一个测试类来测试演示一下,代码我在此处就不贴出,