/**
* 观察者模式
*/
public class Main {
public static void main(String[] args) {
IntegerObjectObservable integerObjectObservable = new IntegerObjectObservable();
IntegerObjectObserver integerObjectObserverA = new IntegerObjectObserver(integerObjectObservable,"A");
IntegerObjectObserver integerObjectObserverB = new IntegerObjectObserver(integerObjectObservable,"B");
integerObjectObserverA.setValue(1);
System.out.println(integerObjectObserverA.getName()+" " + integerObjectObserverA.getValue());
System.out.println(integerObjectObserverB.getName()+" " + integerObjectObserverB.getValue());
integerObjectObserverB.setValue(2);
System.out.println(integerObjectObserverA.getName()+" " + integerObjectObserverA.getValue());
System.out.println(integerObjectObserverB.getName()+" " + integerObjectObserverB.getValue());
}
}
import java.util.Observable;
public class IntegerObjectObservable extends Observable {
private Integer value;
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public void setChanged(){
super.setChanged();
}
}
public class IntegerObjectObserver implements Observer {
private IntegerObjectObservable integerObjectObservable;
private String name;
private Integer value;
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
integerObjectObservable.setValue(this.value);
integerObjectObservable.setChanged();
integerObjectObservable.notifyObservers();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IntegerObjectObserver(IntegerObjectObservable integerObjectObservable, String name) {
this.integerObjectObservable = integerObjectObservable;
this.name = name;
integerObjectObservable.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
Integer value = ((IntegerObjectObservable) o).getValue();
this.value = value;
}
}
问题:
比如有一组对象,我想改变一个对象状态的时候,也改变其他对象的状态,怎么做?
用法:
直观的做法是用循环去改变,这样也不能说不正确,但是就是典型的伪面向对象编程方式。
面向对象编程最重要的是要去发现编程的共性,这个问题的共性是一组对象的监听问题,大家都监听一个事件,那个事件如果有状态变化,大家就都知道了,如果一个对象状态变化直接去触发这个事件,那大家也都知道了。
所以,总结一下,这个大家共同监听的事件就是被观察者,每个对象都是观察者,代码再看看也就理解了。
需要注意的是通知大家的时候,需要先调用setChanged()