观察者模式
来源:互联网 发布:java用redis缓存的步骤 编辑:程序博客网 时间:2024/06/05 03:56
package b_Observer;
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temperature;
private float humidity;
private Subject weatherData;//取消注册时有这个引用会好很多
public CurrentConditionsDisplay(Subject weatherData) { this.weatherData = weatherData; weatherData.registerObserver(this);}public void display() { System.out.println(temperature + " " + humidity);}public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; display();}
}
package b_Observer;
public class StatisticsDisplay implements Observer, DisplayElement {
private float temperature;
private float pressure;
private Subject weatherData;// 取消注册时有这个引用会好很多
public StatisticsDisplay(Subject weatherData) { this.weatherData = weatherData; weatherData.registerObserver(this);}public void display() { System.out.println(temperature + " " + pressure);}public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.pressure = pressure; display();}
}
package b_Observer;
public interface Subject {
// 注册观察者
void registerObserver(Observer o);
// 删除观察者void removeObserver(Observer o);// 通知观察者void notifyObserver();
}
/**
* 所有的观察者必须实现update(),当气象值观测值改变时,主题会把这些状态值当做方法参数,传送给观察者
*/
interface Observer {
void update(float temp, float humidity, float pressure);
}
/**
* 当布告板需要显示时,调用此方法
*
*/
interface DisplayElement {
void display();
}
package b_Observer;
import java.util.ArrayList;
public class WeatherData implements Subject {
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() { observers = new ArrayList<Observer>();}@Overridepublic void registerObserver(Observer o) { observers.add(o);}@Overridepublic void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) observers.remove(i);}@Overridepublic void notifyObserver() { for (int i = observers.size() - 1; i >= 0; i--) { Observer observer = observers.get(i); observer.update(temperature, humidity, pressure); }}// 当从气象站获得数据,通知观察者public void measurementsChanged() { notifyObserver();}public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged();}
}
package b_Observer;
/**
* 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖都会收到通知并自动更新 (MVC)
* 设计原则:为了交互对象之间的松耦合设计努力
* 出版者+订阅者=观察者模式 设计原则:低耦合,高内聚
*
* 对于每一个设计原则,请描述观察者模式如何遵循此原则。
* 设计原则:找出程序中会变化的方面,然后将其和固定不变的方面相分离。
* 在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规划!
* 设计原则:针对接口编程,不针对实现编程。
* 主题与观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点。
* 设计原则:多用组合,少用继承。
* 观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。
*/
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
// 2个布告板(观察者) CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay( weatherData); StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); weatherData.setMeasurements(80, 65, 10); weatherData.setMeasurements(80, 62, 10);}
}
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- Wireshark内容过滤方法
- Android中不得不谈的setContentView
- android JNI
- API 前后端分离重构
- ROS机器人Diego 1#制作(二十二)基于EAI F4激光雷达数据进行定位amcl
- 观察者模式
- maven的fail to transfer问题
- Eclipse配置servlet实现CRUD
- PHP跳出循环的方法及continue、break、exit、return的区别
- 数字图像学习点运算
- 循环消息队列
- MongoDB文档翻译-引言-文档
- 欢迎使用CSDN-markdown编辑器
- 利用h5的本地存储实现登录页面里的记住账号和密码功能