java设计模式-观察者模式

观察者模式定义:

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

 

观察者模式的组成:

1.主题

2.观察者

 

程序代码例子:

 1 package com.ming.mode.observer;
 2 
 3 
 4 /**
 5  * 创建主题接口对象 
 6  * @author mingge
 7  *
 8  */
 9 public interface Subject {
10 
11     void registerObserver(Observer observer);
12     void removeObserver(Observer observer);
13     void notifyObservers();
14 }
 1 package com.ming.mode.observer;
 2 
 3 /**
 4  * 创建观察者接口
 5  * @author mingge
 6  *
 7  */
 8 public interface Observer {
 9 
10     void update(float t,float b,float ts);
11 }
1 package com.ming.mode.observer;
2 
3 public interface DisplayElement {
4 
5     void display();
6 }
 1 package com.ming.mode.observer;
 2 
 3 import java.util.ArrayList;
 4 
 5 
 6 /**
 7  * 创建主题接口实现对象
 8  * @author mingge
 9  *
10  */
11 public class WeatherData implements Subject{
12 
13     private ArrayList<Observer> observers;
14     
15     private float temperature;
16     
17     private float humidity;
18     
19     private float pressure;
20     
21     public WeatherData() {
22         observers=new ArrayList<Observer>();
23     }
24     
25     @Override
26     public void registerObserver(Observer observer) {
27         observers.add(observer);
28         
29     }
30 
31     @Override
32     public void removeObserver(Observer observer) {
33         int i=observers.indexOf(observer);
34         if(i>=0){
35             observers.remove(i);
36         }
37         
38     }
39 
40     @Override
41     public void notifyObservers() {
42         for(int i=0;i<observers.size();i++){
43             Observer observer=(Observer)observers.get(i);
44             observer.update(temperature, humidity, pressure);
45         }
46     }
47     
48     public void measurementsChanged(){
49         notifyObservers();
50     }
51     
52     public void setMeasurement(float a,float b,float c){
53         this.temperature=a;
54         this.humidity=b;
55         this.pressure=c;
56         measurementsChanged();
57     }
58     
59 }
 1 package com.ming.mode.observer;
 2 
 3 public class CourrentObserver implements Observer,DisplayElement {
 4     
 5     private float temperature;
 6     
 7     private float humidity;
 8     
 9     private Subject weatherData;
10     
11     public CourrentObserver(Subject weatherData1) {
12         this.weatherData=weatherData1;
13         weatherData.registerObserver(this);
14     }
15 
16     @Override
17     public void display() {
18         System.out.println("temperature:"+temperature+",humidity:"+humidity);
19         
20     }
21 
22     @Override
23     public void update(float t, float b, float ts) {
24        this.temperature=t;
25        this.humidity=b;
26        display();
27         
28     }
29 
30 }
 1 package com.ming.mode.observer;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         WeatherData weatherData=new WeatherData();
 7         CourrentObserver o=new CourrentObserver(weatherData);
 8         weatherData.setMeasurement(21, 32, 32);
 9         weatherData.setMeasurement(20, 31, 32);
10     }
11 }

 

java内置观察模式的实现

 1 package com.ming.mode.observer.inner;
 2 
 3 import java.util.Observable;
 4 
 5 public class WeatherData extends Observable{
 6 
 7     private float temperature;
 8     
 9     private float humidity;
10     
11     private float pressure;
12     
13     public WeatherData() {
14         
15     }
16 
17     public void measurementsChanged(){
18         setChanged();
19         notifyObservers();
20     }
21     
22     public void setMeasurements(float t,float b,float c){
23         this.temperature=t;
24         this.humidity=b;
25         this.pressure=c;
26         measurementsChanged();
27     }
28     
29     public float getTemperature() {
30         return temperature;
31     }
32 
33     public void setTemperature(float temperature) {
34         this.temperature = temperature;
35     }
36 
37     public float getHumidity() {
38         return humidity;
39     }
40 
41     public void setHumidity(float humidity) {
42         this.humidity = humidity;
43     }
44 
45     public float getPressure() {
46         return pressure;
47     }
48 
49     public void setPressure(float pressure) {
50         this.pressure = pressure;
51     }
52     
53     
54     
55 }

 

 1 package com.ming.mode.observer.inner;
 2 
 3 import java.util.Observable;
 4 import java.util.Observer;
 5 
 6 import com.ming.mode.observer.DisplayElement;
 7 
 8 public class CurrentConditionsDisplay implements Observer,DisplayElement{
 9     
10     private Observable observable;
11     
12     private float temperature;
13     
14     private float humidity;
15     
16     public CurrentConditionsDisplay(Observable observable){
17         this.observable=observable;
18         observable.addObserver(this);
19     }
20     
21     
22     @Override
23     public void display() {
24         System.out.println("temperature:"+temperature+",humidity:"+humidity);
25         
26     }
27 
28     @Override
29     public void update(Observable o, Object arg) {
30         if(o instanceof WeatherData){
31             WeatherData w=(WeatherData)o;
32             this.temperature=w.getTemperature();
33             this.humidity=w.getHumidity();
34             display();
35         }
36     }
37 
38     
39 }
 1 package com.ming.mode.observer.inner;
 2 public class Test {
 3 
 4     public static void main(String[] args) {
 5         WeatherData weatherData=new WeatherData();
 6         CurrentConditionsDisplay o=new CurrentConditionsDisplay(weatherData);
 7         weatherData.setMeasurements(21, 32, 32);
 8         weatherData.setMeasurements(20, 31, 32);
 9         System.out.println("ok");
10     }
11 }

 

posted @ 2016-07-21 15:09  全力以赴001  阅读(282)  评论(0编辑  收藏  举报