Java观察者模式

1. “推” 模式,被观察者将更新的数据 “推” 给观察者们

ObservableClassA 继承 Observable。当data发生变化,即调用setData()方法时,将变化的数值通知给观察者们。

ObservableClassA.java

 1 import java.util.Observable;
 2 
 3 
 4 public class ObservableClassA extends Observable{
 5     private String data;
 6     
 7     public ObservableClassA(String dataInput) {
 8         data = dataInput;
 9     }
10     
11     public String getData() {
12         return this.data;
13     }
14     
15     public void setData(String dataInput) {
16         this.data = dataInput;
17         
18         this.setChanged();
19         this.notifyObservers(this.data);
20     }
21 }

ObserverX 实现 Observer接口,即update()方法。当被观察者发出广播(通知观察者)时,update方法被调用,打印更新数据。

ObserverX.java

 1 import java.util.Observable;
 2 import java.util.Observer;
 3 
 4 
 5 public class ObserverX implements Observer{
 6 
 7     private String name;
 8     
 9     public ObserverX(String nameIn) {
10         name = nameIn;
11     }
12     
13     public void update(Observable arg0, Object arg1) {
14         if (arg0 instanceof ObservableClassA) {
15             String data = (String) arg1;
16             System.out.println("Observer " + name + " : data updated, value is " + data);
17         }
18     }
19 
20 }

OvserverExample.java

 1 public class ObserverExample {
 2 
 3     public static void main(String args[]) {
 4         ObservableClassA aClass = new ObservableClassA("abc");
 5         ObserverX x1 = new ObserverX("X1");
 6         ObserverX x2 = new ObserverX("X2");
 7         
 8         aClass.addObserver(x1);
 9         aClass.addObserver(x2);
10 
11         aClass.setData("AAA");
12         aClass.setData("BBB");
13     }
14 }

运行结果:

Observer X2 : data updated, value is AAA
Observer X1 : data updated, value is AAA
Observer X2 : data updated, value is BBB
Observer X1 : data updated, value is BBB

 

2. “拉” 模式,被观察者只通知观察者们数据有更新,观察者们需自己将数据 “拉” 过来。

ObservableClassA.java

 1 import java.util.Observable;
 2 
 3 
 4 public class ObservableClassA extends Observable{
 5     private String data;
 6     
 7     public ObservableClassA(String dataInput) {
 8         data = dataInput;
 9     }
10     
11     public String getData() {
12         return this.data;
13     }
14     
15     public void setData(String dataInput) {
16         this.data = dataInput;
17         
18         this.setChanged();
19 //        this.notifyObservers(this.data);//推模式
20         this.notifyObservers();//拉模式
21     }
22 }

ObserverX.java

 1 import java.util.Observable;
 2 import java.util.Observer;
 3 
 4 
 5 public class ObserverX implements Observer{
 6 
 7     private String name;
 8     
 9     public ObserverX(String nameIn) {
10         name = nameIn;
11     }
12     
13     public void update(Observable arg0, Object arg1) {
14         if (arg0 instanceof ObservableClassA) {
15             ObservableClassA observableA = (ObservableClassA) arg0;
16             String data = observableA.getData();
17             System.out.println("Observer " + name + " : data updated, value is " + data);
18         }
19     }
20     
21 //    public void update(Observable arg0, Object arg1) {
22 //        if (arg0 instanceof ObservableClassA) {
23 //            String data = (String) arg1;
24 //            System.out.println("Observer " + name + " : data updated, value is " + data);
25 //        }
26 //    }
27 }

运行结果:

Observer X2 : data updated, value is AAA
Observer X1 : data updated, value is AAA
Observer X2 : data updated, value is BBB
Observer X1 : data updated, value is BBB

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。