keeping your objects in the know
类似于报纸发行商和订阅者之间的关系
publisher + subscribers = observer pattern
我们称发行者为subject,订阅者为observers
1.subject对象管理一些数据
2.当subject对象中的数据改变时,通知observers
3.注册到subject的observers接收更新,当subject中的数据改变
观察者模式定义一个一对多的关系,当那个一个对象状态改变,附属的多个对象会接收到通知然后自动修改自己的状态
观察者模式提供subject和observer之间的松耦合
好处:
1.subject只知道observer实现了一个特定接口
2.很容易添加一个新的observer
3.添加新的observer不需要修改subject
4.重用subject,observer很方便,他们之间独立存在
5.对于subject,observer的修改不会影响到对方
例子:
一个天气采集系统,参数有温度,湿度以及气压,有多个显示系统,当3个参数改变的时候,显示系统都要相应的修改
一般情况的设计:
public calss WeatherData{
//instance variable decalrations
public void measurementsChanged(){
float temp = getTemperature();
float pressure = gethumidity();
float pressure = getPressure();
currentConditionsDisplay.update(temp,humidity,pressure);
statisticsDisplay.update(temp,humidity,pressure);
}
//other weatherData methods here
}
但是我们每次新添加一个显示系统需要修改代码,不能在运行时添加或者删除某个显示系统,采用观察者模式修改如下:
public interface Subject{
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
public interface Observer{
public void update(float temp,float humidity,float pressure);
}
public class WeatherData implements Subject
{
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
observer = new ArrayList();
}
public void registerobserver(Observer o){
observers.add(o);
}
public void removeObserver(Observer o){
int i = observers.indexOf(o);
if(i>=0)
observers.remove(o);
}
public void notifyObservers(){
for(int i=0;i<observers.size();i++){
Observer observer = (Observer)observers.get(i);
observer.update(temperature,humidity,pressure);
}
}
public void measurementsChanged(){
notifyObservers();
}
public void setMeasurements(float t,float h,float p){
this.temperature = t;
this.humidity = h;
this.pressure = pressure;
measurementsChanged();
}
//other get-method
}
public class CurrentConditionsDisplay implements Observer
{
private float temperature;
private float humidity;
private float pressure;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData){
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float f,float h,float p){
this.temperature = t;
this.humidity = h;
this.pressure = pressure;
display();
}
public void display(){
//do something
}
}
public class WeatherStation
{
public static void main(String[] args){
WeatherStation weatherStation = new WeatherStation();
CurrentConditionsDisplay currentDisplay
= new CurrentConditionsDisplay(weatherStation);
weartherStation.setMeasurements(80,65,30.4f);
}
}
这样我们给subject新建一个observer的时候就不用修改subject的代码,实现松耦合
java内置的观察者模式
Observer interface
Observable class
1.新建一个observer
实现java.util.Observer接口,可以调用addObserver()和deleteoberser()
2.observable发送通知
1>先调用setChanged()方法指明状态已经修改
2>调用notifyObservers()方法:notifyObservers()或者notifyObservers(Object arg)
我们可以在setChanged()方法中加入一些特殊条件的判断
3.observer接收通知
update(Observable o,Object arg)
这里的object对应notifyObservers(Object obj)中的对象, 如果调用的notifyObservers()方法,则update中的Object为null
observer可以用传递过来的参数也可以从Observable中通过getter方法得到 需要的参数
package pattern;
import java.util.Observable;
public class WeatherData extends Observable{
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
}
public void measurementsChanged(){
setChanged();
notifyObservers();
}
public void setMeasurements(float temperature,
float humidity,
float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
package pattern;
import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer {
Observable observable;
private float temperature;
private float humidity;
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData) obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("current condition: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
分享到:
相关推荐
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
"ObserverPattern(订阅模式)3.zip"中的代码可能进一步阐述了观察者模式,这里的“订阅”一词可能意味着用户可以订阅特定的主题,只有当这些主题的状态改变时,用户才会收到通知。这与传统的观察者模式类似,但更加...
**C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,属于对象交互模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...
Swift µframework 实现观察者模式Observer pattern
**观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在分布式系统、事件...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...
从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
观察者模式(Observer Pattern)是软件设计模式的一种,属于行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式主要通过...
观察者模式(Observer Design Pattern)是行为型设计模式的一种,主要解决的是“类或对象之间的交互”问题。它定义了一个一对多的依赖关系,当一个对象的状态改变时,所有依赖的对象都会自动收到通知。 观察者模式...
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...