被观察者对象状态发生改变时,观察者对象都能收到通知.
interface Observers {
void updateMethod(Announcer announcer);
}
class Father implements Observers {
private int status;
public int getStatus() {
return status;
}
@Override
public void updateMethod(Announcer announcer) {
ConcreteSon son = (ConcreteSon) announcer;
this.status = son.getStatus();
System.out.println("爸爸收到");
}
}
interface Announcer {
void notifyAllObserver();
}
class Son implements Announcer {
private List<Observers> list = new ArrayList<>();
public void setObserver(Observers observer) {
list.add(observer);
}
public void removeObserver(Observers observer) {
list.remove(observer);
}
public void notifyAllObserver() {
System.out.println("儿子呼叫家庭成员");
for (Observers observer : list) {
observer.updateMethod(this);
}
}
}
class ConcreteSon extends Son {
private int status;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
System.out.println("儿子状态改变");
this.notifyAllObserver();
}
}
/**
* 使用JDK内置类实现观察者模式
*/
class ConcreteSubject extends Observable {
private int status;
public void setStatus(int status) {
this.status = status;
setChanged();
notifyObservers(status);
}
}
class ObserverA implements Observer {
private int status;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public void update(Observable o, Object arg) {
this.status = (int) arg;
}
}
/**
* 观察者模式
*/
public class Subject {
public static void main(String[] args) {
Observers observer = new Father();
Observers observer1 = new Father();
Observers observer2 = new Father();
Observers observer3 = new Father();
ConcreteSon son = new ConcreteSon();
son.setObserver(observer);
son.setObserver(observer1);
son.setObserver(observer2);
son.setObserver(observer3);
son.setStatus(5);
System.out.println(((Father) observer).getStatus());
System.out.println("----------------------");
Observable observable = new ConcreteSubject();
ObserverA observerA = new ObserverA();
ObserverA observerB = new ObserverA();
ObserverA observerC = new ObserverA();
observable.addObserver(observerA);
observable.addObserver(observerB);
observable.addObserver(observerC);
((ConcreteSubject) observable).setStatus(2);
System.out.println(observerA.getStatus());
System.out.println(observerB.getStatus());
System.out.println(observerC.getStatus());
}
}