包括两个操作,观察者订阅自己关心的主题和主题有数据变化后通知观察者们。
首先,需要定义主题,每个主题需要持有观察者列表的引用,用于在数据变更的时候通知各个观察者:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | public class Subject {private List<Observer> observers = new ArrayList<>();
 private int state;
 
 public int getState() {
 return state;
 }
 
 public void setState(int state) {
 this.state = state;
 
 notifyAllObservers();
 }
 
 
 public void attach(Observer observer) {
 observers.add(observer);
 }
 
 
 public void notifyAllObservers() {
 for (Observer observer : observers) {
 observer.update();
 }
 }
 }
 
 | 
定义观察者接口:
| 12
 3
 4
 5
 
 | public abstract class Observer {protected Subject subject;
 
 public abstract void update();
 }
 
 | 
定义具体的几个观察者类:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | public class BinaryObserver extends Observer {
 public BinaryObserver(Subject subject) {
 this.subject = subject;
 
 this.subject.attach(this);
 }
 
 
 @Override
 public void update() {
 String result = Integer.toBinaryString(subject.getState());
 System.out.println("订阅的数据发生变化,新的数据处理为二进制值为:" + result);
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public class OctalObserver extends Observer {public OctalObserver(Subject subject) {
 this.subject = subject;
 this.subject.attach(this);
 }
 
 @Override
 public void update() {
 String result = Integer.toOctalString(subject.getState());
 System.out.println("订阅的数据发生变化,新的数据处理为八进制值为:" + result);
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public class HexObserver extends Observer {public HexObserver(Subject subject) {
 this.subject = subject;
 this.subject.attach(this);
 }
 
 @Override
 public void update() {
 String result = Integer.toHexString(subject.getState()).toUpperCase();
 System.out.println("订阅的数据发生变化,新的数据处理为十六进制值为:" + result);
 }
 }
 
 | 
客户端使用:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public class Main {public static void main(String[] args) {
 
 Subject subject = new Subject();
 
 new BinaryObserver(subject);
 new OctalObserver(subject);
 new HexObserver(subject);
 
 subject.setState(11);
 }
 }
 
 | 
output:
| 12
 3
 
 | 订阅的数据发生变化,新的数据处理为二进制值为:1011订阅的数据发生变化,新的数据处理为八进制值为:13
 订阅的数据发生变化,新的数据处理为十六进制值为:B
 
 | 
参考