观察者模式 (学习记录)
一: 创建一个被观察者
import java.util.Observable;
public class MyObservable extends Observable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
setChanged();
notifyObservers();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
//依次调用 通知观察者们
setChanged();
notifyObservers();
}
@Override
public String toString() {
return "MyObservable{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
二:创建一个观察者
import java.util.Observable;
import java.util.Observer;
public class MyObserver implements Observer {
private int i;
private MyObservable myObservable;
public MyObserver(int i) {
this.i = i;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public MyObservable getMyObservable() {
return myObservable;
}
public void setMyObservable(MyObservable myObservable) {
this.myObservable = myObservable;
}
@Override
public void update(Observable o, Object arg) {
//接收最新的被观察者对象
if (o instanceof MyObservable) {
MyObservable myObservable = (MyObservable) o;
Logger.d("test---> i=" + i + "; update=" + myObservable.toString() + " " + arg);
}
}
}
三:有了被观察者 和 观察者 就可以联动了
public class ObservableUtil {
public static void doTest() {
MyObservable myObservable = new MyObservable();
myObservable.setAge(18);
myObservable.setName("MCY");
for (int i = 0; i < 10; i++) {
MyObserver myObserver = new MyObserver(i);
myObservable.addObserver(myObserver);//添加观察者
}
Logger.d("test--- origin " + myObservable.toString());
//被观察者更新自己的数据 观察者会接收到此更新
myObservable.setAge(99);
myObservable.setName("GGG");
}
}
总结:被观察者内部定义了一个 Vector<Observer> obs; 就是用来存放观察它的观察者们;要想实现观察者收到被观察者的信息变动,就需要被观察者依次调用setChanged();notifyObservers();这两个方法。观察者通过回调函数update(Observable o, Object arg)
接收最新的被观察者。这就是最简单的观察者模式的应用Demo。