观察者模式的感觉就是设计一个主题,主题中的数据发生变化会通知所有观察者数据发生变化了,然后每个观察者根据变化的数据改变自我的展示情况。举个例子,就比如我们看电影,当电影的内容改变的时候,我们每个人的脑海里呈现的信息就会发生改变。
借用一下菜鸟教程的类图。
一个主题有观察者列表,state两个成员变量。以及get、set方法,attach增加观察者方法,notifyall通知所有观察者方法。每个观察者继承Observer抽象类,观察者内心都有一个主题subject,因为他们要观察的就是这个主题,以及每个人自己的update方法,因为信息在每个人心中的展示可能不一样。
talk is cheep, show me the code.
Subject.java
package ObserverPattern;
import java.util.ArrayList;
import java.util.List;
public class Subject {
//观察者列表
private List<Observer> observers = new ArrayList<Observer>();
//所有观察者观察的target
private int state;
public int getState(){
return state;
}
public void setState(int state){
this.state = state;
notifyAllObervers();
}
//给主题添加观察者
public void attach(Observer observer){
observers.add(observer);
}
//通知所有观察者他们观察的target变了,让每个观察者更新自己的展示数据
public void notifyAllObervers(){
for (Observer observer : observers){
observer.update();
}
}
}
Observer.java
package ObserverPattern;
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
OctalObserver.java
package ObserverPattern;
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update(){
System.out.println("Hex String: "
+ Integer.toHexString(subject.getState()));
}
}
BinaryObserver.java
package ObserverPattern;
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject){
this.subject = subject;
//这个第二行说实话有点没看懂
this.subject.attach(this);
}
@Override
public void update(){
System.out.println("Binary String:"
+Integer.toBinaryString(subject.getState()));
}
}
HexaObserver.java
package ObserverPattern;
public class HexaObserver extends Observer{
public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update(){
System.out.println("Hex String: "
+ Integer.toHexString(subject.getState()));
}
}
main.java
//观察者模式
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);