观察者模式实例解析
观察者模式实例分析
- 观察者模式介绍
观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标奖情况发送到观察者的。
- 观察者模式应用场景
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。
- 观察者模式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.本实验观察者模式优缺点
优点:
1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
2)支持广播通讯
缺点:
观察者模式可以知道观察者所关注的对象发生了变化,但是并不知道对象是怎么发生变化的