观察者模式(jdk实现)

1.定义

在对象中定义一对多的依赖,当一个对象改变状态,依赖它的对象会收到通知并更新.

2.实现 (主要通过jdk自己定义的观察者实现)

以气象站通知展示板为例子,当气象站收到的各种参数改变的时候,就通知展示板并显示收到的参数.

定义一个气象站,继承jdk的Observable类

  1. public class WeatherData extends Observable{
  2. private float temperature;
  3. private float humidity;
  4. private float pressure;
  5. public WeatherData() {
  6. }
  7. public void measurementChanged() {
  8. setChanged();
  9. notifyObservers();
  10. }
  11. public void setMeasurements(float temperature, float humidity, float pressure) {
  12. this.temperature = temperature;
  13. this.humidity = humidity;
  14. this.pressure = pressure;
  15. measurementChanged();//改变状态并通知
  16. }
  17. public float getTemperature() {
  18. return temperature;
  19. }
  20. public float getHumidity() {
  21. return humidity;
  22. }
  23. public float getPressure() {
  24. return pressure;
  25. }
  26. }

定义观察者———展示板,并且实现了jdk的Observer接口,代码如下

  1. public class CurrentConditionsDisplay implements Observer, DisplayElement{
  2. Observable observable;
  3. private float temperature;
  4. private float humidity;
  5. public CurrentConditionsDisplay(Observable observable) {
  6. this.observable = observable;
  7. observable.addObserver(this);
  8. }
  9. @Override
  10. public void update(Observable o, Object arg) {
  11. if (o instanceof WeatherData) {
  12. WeatherData weatherData = (WeatherData)o;
  13. this.temperature = weatherData.getTemperature();
  14. this.humidity = weatherData.getHumidity();
  15. display();
  16. }
  17. }
  18. @Override
  19. public void display() {
  20. System.out.println(toString());
  21. }
  22. @Override
  23. public String toString() {
  24. return "CurrentConditionsDisplay [temperature=" + temperature + ", humidity=" + humidity + "]";
  25. }
  26. }

测试类如下

  1. public class ObserverTest {
  2. public static void main(String[] args) {
  3. WeatherData weatherData = new WeatherData();
  4. CurrentConditionsDisplay display = new CurrentConditionsDisplay(weatherData);
  5. weatherData.setMeasurements(1.2F, 1.2F, 1.3F);
  6. }
  7. }

3.总结

jdk实现观察者模式有个缺点就是Observable是类,不是接口,java只支持单继承,类会限制被观察者的拓展性.

而且jdk 的setChanged 和 clearChanged 方法都是protected 修饰,不能通过组合来实现这个方法,灵活性较差.

建议根据具体的需求来决定自己实现还是使用jdk的观察者模式.

转载于:https://www.cnblogs.com/lishuaiqi/p/11094208.html

发表评论

表情:
评论列表 (有 0 条评论,89人围观)

还没有评论,来说两句吧...

相关阅读

    相关 观察模式学习以及jdk实现

    观察者模式存在观察者和被观察者,就像是订阅一样,比如一群读者订阅了短信通知,当短信有消息时,会调用订阅者自己的一个方法.使读者得到通知。 使用jdk自带的类模拟一个

    相关 观察模式

    什么是观察者模式 有人这么说 > 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 > > 这个主题对象在状态上发生变化时,会通知所有观

    相关 观察模式

    观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 观察者模式图: ![输入图片说明][13105107_Mf

    相关 观察模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 意图:定义对象