![321b133c1e0218249010e6bb4f7ccef5.png](https://i-blog.csdnimg.cn/blog_migrate/a21c90cff91e752b49fb3996475a9930.jpeg)
观察者下篇
在上一篇文章中,我们通过污污弹公司司小司做气象站项目学习了观察者模式怎么使用。在本篇中,我们对观察者模式进行总结及关键点,还有一个就是Java中内置的观察者模式。
本文出处:凯哥Java(wx:kagejava)
一:Java内置的观察者
我们将使用Java内置的观察者将气象站项目重新写一次。
内置观察者的区别:
Subject对象:
1:subject名称变了,变成了Observable了;功能不变,还是注册、移除、通知观察者三个功能;
2:observable是对象而非接口了,所以在使用的时候,不能在使用实现了,需要使用继承关系。好处就是:因为是继承关系,所以在注册观察者、移除观察者、通知观察者这三个方法具体实现我们可以不用写了。
Observer对象:
observer对象名字没有变化,功能还是update,没有变化。 而且还是接口对象。
那么为什么observer不用类而用接口呢?因为我们知道,我们的observer是不同的项目,需求不一定的。所以,只能使用接口来定义了。具体实现,各个项目根据自己项目功能自行实现即可。
不同:update时候,可以选择将信息主动推送给观察者还是让观察者自己来拉去。在Java内置的观察者模式中,推/拉都可以。
使用Java内置观察者实现的代码:
项目结构:
![a870b6753fd0a087da8d38c33a499920.png](https://i-blog.csdnimg.cn/blog_migrate/8c98b8d6e422025ca0a2f47482f34ec8.jpeg)
测试类:JavaObserverWeatherMainTest
需要说明的:
public class CurrentConditionJava implements Observer {}
实现的Observer对象所在位置:import java.util.Observer;
public class WeaterDataJava extends Observable {}
继承的Observerable对象所在位置:import java.util.Observable;
运行结果:
![7c9068bbb610db59c0998293ff6107db.png](https://i-blog.csdnimg.cn/blog_migrate/54543883015b73d0213b0d95adebff69.jpeg)
达到我们预期的效果。说明,使用Java内置的观察者模式成功!
使用Java内置的观察者需要唯一注意的地方:observerable的继承者在datachange时候,需要先setChanged()。如下图:
![840034db6e255789614525e6d35642ec.png](https://i-blog.csdnimg.cn/blog_migrate/9f897fa4fd00ec14b0cec8b92bbf3535.jpeg)
这一点一定要注意。
二:观察者模式总结及关键点
百科上对观察者模式基本介绍:
![64344e1b7a61ffa1d676b58f0271869d.png](https://i-blog.csdnimg.cn/blog_migrate/bf597650ea5deec72a1159ede8ac8441.jpeg)
实现方式:
![0d105586a653d17c7b08e4272420046f.png](https://i-blog.csdnimg.cn/blog_migrate/3e90f38abf88566f686a1765a362cff9.jpeg)
观察者模式使用场景:
![03aeb5b4fa27654461820576d3c9b188.png](https://i-blog.csdnimg.cn/blog_migrate/ced8351d8df14ea3b03543ab1d202d06.jpeg)
观察者模式四个角色:
![ce71810281923c2396bb6488d958436f.png](https://i-blog.csdnimg.cn/blog_migrate/a2872d0f2123fc241a3eea74af6104d2.jpeg)
抽象主题角色(subject)、主题角色具体实现类
抽象观察者角色(observer)、观察者具体实现类
观察者模式的优缺点:
![53a60ade32d8a0b849da3187dc954432.png](https://i-blog.csdnimg.cn/blog_migrate/853a60593882deb14d26dad797623aec.jpeg)
观察者模式执行过程
![d11e0a3f09777fb8dfecccdf7f39c583.png](https://i-blog.csdnimg.cn/blog_migrate/2d0fcfa566f19475bf66daa6673ef74e.jpeg)
从观察者模式中体会,松耦合、高内聚、隔离影响的意义:
松耦合:类与类之间不要太依赖,没有顺序。依赖类不用关系被依赖类的内部是怎么实现的。
对应天气站项目:实现了subject接口的天气对象不需要关系具体的公告板内部怎么实现的,需要做哪些。subject子类之关心公告板是否实现了observer接口类即可。
就算实现了observer的公告板对象项目死掉了,subject对象依然可以正常运行。反之,就算subject项目死掉了,依然不会影响observer项目的运行。无非就是公告板不能公布最新数据而已。这就很好的体现了松耦合的好处。
高内聚:对象内部是高内聚的。这样便于调试、扩展等。