观察者模式实例分析

  1. 观察者模式介绍

观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标奖情况发送到观察者的。

 

  1. 观察者模式应用场景

当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。

  1. 观察者模式UML图

 

  1. 观察者模式应用实例

项目链接: https://github.com/cyy3900/ObserverPattern/tree/master/ObserverPattern

1) 观察者

观察者接口;

Observerl类是是所有观察者的抽象,观察者可以通过具体实现来创建观察者。

package com.cyy.observer;
public interface Subject { //信息发布者
    public void registerObserver(Observer o);//注册监听器
    public void removeObserver(Observer o);//移除监听器
    public void notifyObservers();//发送消息
}

 

  具体观察者

  CurrentConditionDisplay是具体的观察者,在接口中具体实现天气的更新以及展示。

package com.cyy.observer.impl;
import com.cyy.observer.DisplayElement;
import com.cyy.observer.Observer;
import com.cyy.observer.Subject;
public class CurrentConditionDisplay implements Observer, DisplayElement {
 
    private float temperature;
    private float humidity;
    private float pressure;
    private Subject subject;
    
    public CurrentConditionDisplay(Subject subject) {
        // TODO Auto-generated constructor stub
        this.subject = subject;
        subject.registerObserver(this);
    }
    
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("Current Conditions:" + temperature + ":" + humidity +"" + pressure);
    }
 
    @Override
    public void update(float temperature, float humidity, float pressure) {
        // TODO Auto-generated method stub
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        display();
    }
 
}

 

2) 被观察者

主题接口subject:定义了注册添加、删除观察者以及发送通知的方法

package com.cyy.observer;
public interface Subject { //信息发布者
    public void registerObserver(Observer o);//注册监听器
    public void removeObserver(Observer o);//移除监听器
    public void notifyObservers();//发送消息
}

 

 

具体类WeatherData:具体实现了添加和删除观察者的方法,并能在数据更新时向观察者发送通知

package com.cyy.observer.impl;
 
import java.util.ArrayList;
 
import com.cyy.observer.Observer;
import com.cyy.observer.Subject;
public class WeatherData implements Subject {
 
    private float temperature;
    private float humidity;
    private float pressure;
    
    private ArrayList<Observer> observers;
    
    public WeatherData() {
        // TODO Auto-generated constructor stub
        observers = new ArrayList<Observer>();
    }
    
    @Override
    public void registerObserver(Observer o) {
        // TODO Auto-generated method stub
        observers.add(o);
    }
 
    @Override
    public void removeObserver(Observer o) {
        // TODO Auto-generated method stub
        observers.remove(o);
    }
 
    @Override
    public void notifyObservers() {
        // TODO Auto-generated method stub  
        for (Observer observer : observers) {
            observer.update(temperature, humidity, pressure);
        }
    }
 
    public void setMeasurements(float temperature,float humidity,float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObservers();
    }
}

 

5.本实验观察者模式优缺点

优点:

1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

       2)支持广播通讯

缺点:

       观察者模式可以知道观察者所关注的对象发生了变化,但是并不知道对象是怎么发生变化的