《java设计模式》:java内置观察者模式
来源:互联网 发布:java初始化的局部变量 编辑:程序博客网 时间:2024/05/29 13:33
在java API中有内置的观察者模式,在java.util包中有Observer接口和observalbe类,分别对应观察者和主题。java API内置观察者模式支持以push和pull方式传输数据。
Observer : 是一个接口,观察者可实现此接口来得到Observalbe对象更改通知。只含有update方法。
void update(Observable o,Object arg)说明:只要改变了 observable 对象就调用此方法。应用程序调用 Observable 对象的 notifyObservers 方法,以便向所有该对象的观察者通知此改变。 参数:o - observable 对象。arg - 传递给 notifyObservers 方法的参数。
Observable:对应观察者模式中的主题类,当一个observalbe实例改变后,调用observalbe的notifyObservers方法的应用程序会通过调用观察者的update方法通知观察者该实例发生变化。
protected void setChanged()说明 标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。 protected void clearChanged()说明:指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。notifyObservers 方法自动调用此方法。 public boolean hasChanged()说明:测试对象是否改变。 返回:当且仅当在此对象上最近调用了 setChanged 方法,而不是 clearChanged 方法时,才返回 true;否则返回 false。
以上三个方法可以让主题对象更新推送通知时,有更多的灵活性,用户可以通过自己业务需求调用setChanged方法,进行有效更新。
public void notifyObservers(Object arg)说明:如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 arg 参数。 参数:arg - 任意对象。以推的方式,更新通知,通过参数arg传递更新的数据
public void notifyObservers()说明:如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 null。换句话说,此方法等效于: notifyObservers(null)以拉的方式,更新通知。在主题对象中通过getter方法,观察者可以获取自己想要的信息。
java内置观察者模式实例:
主题代码:
import java.util.Observable;public class WeatherData extends Observable {private float temperature;private float pressure;public WeatherData(){}public void measurementsChanged(){setChanged();notifyObservers();}public void setMeatherments(float temperature,float pressure){this.temperature = temperature;this.pressure = pressure;measurementsChanged();}public float getPressure() {return pressure;}public float getTemperature() {return temperature;}}观察者代码:
import java.util.Observable;import java.util.Observer;public class PressureDisplay implements Observer {Observable observable;private float pressure;public PressureDisplay(Observable observable) {this.observable = observable;observable.addObserver(this);}@Overridepublic void update(Observable o, Object arg) {if(o instanceof WeatherData){WeatherData weatherData = (WeatherData)o;this.pressure = weatherData.getPressure();display();}}public void display(){System.out.println("current temperature is" + pressure);}}测试代码:
public class ObserverTest {public static void main(String[] args) {WeatherData weatherData = new WeatherData();TemperatureDisplay temperatureDisplay = new TemperatureDisplay(weatherData);PressureDisplay pressureDisplay = new PressureDisplay(weatherData);weatherData.setMeatherments(30.8f, 70.9f);}}
内置对象缺点:
Observable是一个超类,这就让我们必须设计一个子类继承它,但是如果想让子类具有Observable类和其他超类的行为,就会陷入尴尬,因为java不支持多重继承。而且Observable的某些方法都是protected类型,因此除非继承此类,否则无法使用这些方法。
违反 " 多用组合,少用继承" 的设计原则
0 0
- 《java设计模式》:java内置观察者模式
- 设计模式之观察者模式(java内置)
- Java内置观察者模式
- JAVA设计模式 之 观察者模式(JDK内置实现)
- 设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法
- 设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法
- 设计模式-java内置观察者模式解析
- 设计模式(二)java内置的观察者模式
- JAVA设计模式——观察者模式(JAVA内置的观察者模式)
- 牛刀小试 JAVA内置 观察者模式
- JAVA内置的观察者模式
- java设计模式-----观察者
- JAVA 观察者设计模式
- java观察者设计模式
- java观察者设计模式
- java 观察者设计模式
- JAVA-观察者设计模式
- JAVA设计模式--观察者
- 排序算法
- [设计模式]工厂方法模式(factory method)
- int main() 与 void main()
- Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的TransactionManager)
- MapReduce之WordCount
- 《java设计模式》:java内置观察者模式
- KMP
- Java事务处理全解析(五)—— Template模式
- 数据库知识点---事务
- Homebrew安装简介
- HDU 3068 最长回文
- 计算机图形学-实验5-掌握Bezier样条曲面生成思想、复习基本图元绘制、交互操作和几何变换相关内容
- SDIO驱动(4)sdio总线上driver和设备的match
- 常用命令