`
wangpx
  • 浏览: 198554 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

观察者模式(读书笔记)

阅读更多

观察者模式定义了对象之间的一对多依赖,这样一来当一个对象改变状态时,他的所有依赖着都会收到通知改变状态。
观察者模式 有点类似 打草惊蛇,一石双鸟。对主题进行扩展,不会影响观察者,添加观察者也业不会影响主题。

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics