当一个对象发生变化时(目标对象subject),他通知其他对象(观察者对象observer),其他对象作出相应,这就是观察者模式。
下面直接上代码
接口Observer定义了update(Subject)方法,当目标对象改变时,它的实现类(观察者对象)将调用这个方法做相应
public interface Observer {
void update(Subject subject);
}
这里是目标对象,有存放观察者的容器,notifyObserver()方法实际上就是通知每个在容器中的观察者作出反应(调用update方法)的方法
public class Subject {
private int a = 30;
private List<Observer> list = new ArrayList<>();
public List<Observer> getList() {
return list;
}
public void setList(List<Observer> list) {
this.list = list;
}
public void add(Observer Observer){
this.list.add(Observer);
}
public void notifyObserver(){
for (Observer Observer : list) {
Observer.update(this);
}
}
}
实际的目标对象
public class RealSubject extends Subject {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
this.notifyObserver();
}
}
观察者实现类
public class ObServerImpl implements Observer {
private int myState;
public int getMyState() {
return myState;
}
public void setMyState(int myState) {
this.myState = myState;
}
@Override
public void update(Subject subject) {
myState = ((RealSubject)subject).getState();
}
}
测试:
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ObServerImpl obServer1 = new ObServerImpl();
ObServerImpl obServer2 = new ObServerImpl();
ObServerImpl obServer3 = new ObServerImpl();
realSubject.add(obServer1);
realSubject.add(obServer2);
realSubject.add(obServer3);
realSubject.setState(40);
System.out.println(obServer2.getMyState());
}
}
结果:
在jdk中直接提供了这些类,我们可以直接使用
目标类继承java.util.Observable,在需要通知观察者是调用 setChanged()和notifyObservers(Object)方法。
public class RealSubject extends Observable {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
setChanged();
notifyObservers(state);
}
}
观察者实现java.util.Observer接口,重写update()方法
public class ObserverImpl implements Observer {
private int myState;
@Override
public void update(Observable o, Object arg) {
myState = (int)arg;
}
public int getMyState() {
return myState;
}
public void setMyState(int myState) {
this.myState = myState;
}
}
测试记得使用addObserver(observer)方法将观察者放到目标对象的容器中去
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ObserverImpl observer = new ObserverImpl();
realSubject.addObserver(observer);
realSubject.setState(50);
System.out.println(observer.getMyState());
}
}