观察者模式实例分析
观察者模式介绍
观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标奖情况发送到观察者的。
观察者模式应用场景
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。
观察者模式UML图
观察者模式应用实例
项目链接: 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.本实验观察者模式优缺点
优点: