subject:类似于“偶像”;
observer:类似于“粉丝”;
“粉丝”对“偶像”感兴趣,希望随时得知偶像的一举一动;
“粉丝”到“偶像”那里注册,“偶像”一旦有新闻发生,就推送给已注册的粉丝(回调callback“粉丝”的特定功能)。
java已经提供了Observer接口和Observable类,我们利用此实现观察者模式。
举例:
subject:
import java.util.Observable;
public class Subject extends Observable { // subject:“偶像”
private int state;
public Subject(int state) {
this.state = state;
}
public int getState() {
return state;
}
public void setState(int state) {
if (this.state != state) {
this.state = state;
setChanged(); // 状态发生改变
}
notifyObservers(); // 通知“粉丝”
}
}
observer:
import java.util.Observable;
import java.util.Observer;
public class BinaryObserver implements Observer { // observer:“粉丝”
public BinaryObserver(Observable observable) {
observable.addObserver(this); // 将自己添加到“偶像”粉丝列表中
}
@Override
public void update(Observable o, Object arg) {
// 被“偶像”回调
System.out.println("Binary String: " + Integer.toBinaryString(((Subject)o).getState()));
}
}
import java.util.Observable;
import java.util.Observer;
public class OctalObserver implements Observer { // observer:“粉丝”
public OctalObserver(Observable observable) {
observable.addObserver(this); // 将自己添加到“偶像”粉丝列表中
}
@Override
public void update(Observable o, Object arg) {
// 被“偶像”回调
System.out.println("Octal String: " + Integer.toOctalString(((Subject)o).getState()));
}
}
import java.util.Observable;
import java.util.Observer;
public class HexObserver implements Observer { // observer:“粉丝”
public HexObserver(Observable observable) {
observable.addObserver(this); // 将自己添加到“偶像”粉丝列表中
}
@Override
public void update(Observable o, Object arg) {
// 被“偶像”回调
System.out.println("Hex String: " + Integer.toHexString(((Subject)o).getState()));
}
}
Client:
public class Client {
public static void main(String[] args) {
// 一个“偶像”
Subject subject = new Subject(10);
// 三个“粉丝”
new BinaryObserver(subject);
new OctalObserver(subject);
new HexObserver(subject);
// 状态改变
subject.setState(20);
}
}
结果:
Hex String: 14
Octal String: 24
Binary String: 10100