观察者模式定义了对象之间的一对多依赖,这样一来当一个对象改变状态时,他的所有依赖着都会收到通知改变状态。
观察者模式 有点类似 打草惊蛇,一石双鸟。对主题进行扩展,不会影响观察者,添加观察者也业不会影响主题。
1.观察者模式定义了对象之间一对多的关系。
2。主题(也就是可观察者)用一个共同的接口来更新观察者
3。观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
4 。使用此模式时,你可以被观察者处推或者拉数据。然而推的方式被认为更正确。
5。有多个观察者时,不可以依赖特定的通知次序。
6。java 有多种观察者模式的实现,包括了通用的java。util。Observable
7。要注意java。util。Observable 实现上所带来的问题。
8。如果有必要的话,可以实现自己的Observable,这并不难。
9。Swing大量使用观察者模式。许多GUI框架也是如此
10。此模式也被应用在许多地方
package pattern;
import java.util.ArrayList;
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(
weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
}
}
interface Observer {
public void update(float temp, float humidity, float pressure);
}
interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
interface DisplayElement {
public void display();
}
class WeatherData implements Subject {
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = 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(i);
}
}
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() {
this.notifyObservers();
}
public void setMeasurements(float temperature, float humidity,
float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
this.measurementsChanged();
}
}
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 update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.display();
}
public void display() {
System.out.println("Current conditions:" + temperature
+ "F degrees and" + humidity + "%humidity");
}
}
class ForecastDisplay implements Observer, DisplayElement {
private float currentPressure = 29.92f;
private float lastPressure;
private Subject weatherData;
public ForecastDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.currentPressure = pressure;
this.display();
}
public void display() {
System.out.println("Current conditions:" + currentPressure);
}
}
package pattern;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SwingOberverExample {
JFrame frame;
public static void main(String[] args){
SwingOberverExample example =new SwingOberverExample();
example.go();
}
public void go(){
frame=new JFrame();
JButton button=new JButton("Shoule I do it?");
button.addActionListener(new AngelListener());
button.addActionListener(new DevilListener());
frame.getContentPane().add(BorderLayout.CENTER,button);
}
}
class AngelListener implements ActionListener{
public void actionPerformed(ActionEvent event){
System.out.println("Don't do it,you might regret it!");
}
}
class DevilListener implements ActionListener{
public void actionPerformed(ActionEvent event){
System.out.println("Come on,do it!");
}
}
- 大小: 55 KB
分享到:
相关推荐
观察者模式笔记1
031114_【第11章:Java常用类库】_观察者设计模式笔记
NULL 博文链接:https://mountain-king.iteye.com/blog/720810
HeadFirst 设计模式学习笔记2--观察者模式 demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5581769.aspx
设计模式1,包含了设计模式的基本介绍,以及状态机模式的读书笔记
head first观察者模式学习笔记
移动应用 UI 设计, 读书笔记, 记录摘取书籍中重点信息,有助于页面设计,原型设计等
JAVA模式笔记,JAVA模式的读书笔记,JAVA模式的读书笔记。
1.1 《Head First设计模式》阅读笔记.第一章 1.2 《Head First设计模式》阅读笔记.第二章 1.3 《Head First设计模式》阅读笔记.第三章 1.4 《Head First设计模式》阅读笔记.第四章 1.5 《Head First设计模式》...
USB读书笔记 USB读书笔记 USB读书笔记 USB读书笔记
HeadFirst设计模式 读书 笔记
Java设计模式学习笔记
行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...
设计模式总结笔设计模式总结笔记 设计模式总结笔记 设计模式总结笔记 设计模式总结笔记 设计模式总结笔记 记
NULL 博文链接:https://helei050.iteye.com/blog/2086309
《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》...
毕业论文读书笔记格式,教会你怎么写毕业论文读书笔记格式
读书笔记读书笔记读书笔记
我收集的设计模式的学习笔记,采用pdf格式,便于收藏和查看