观察者模式
观察者模式,主题发布新的内容,订阅者可以获取到最新的消息。也就是当被观察者(观察对象)改变的时候,会通知观察者更新状态。
- Subject:主题
- Observer:观察者的抽象类
- HexObserver: 看到的主题发布的数据是16进制的。
- BinaryObserver:看到的数据是二进制。
代码:
Subject
public class Subject {
private int state;
private List<Observer> observers = new ArrayList<>();
/**
*
*获取最新的主题状态
*/
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
//每次更改主体的状态需要通知所有观察者
notifyAllObservers();
}
/**
* 注册观察者
* @param observer
*/
public void attach(Observer observer){
observers.add(observer);
}
/**
* 通知每个订阅主题的观察者,更新状态
*/
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
Observer
public abstract class Observer {
protected Subject subject;
public abstract void update();
}```
### BinaryObserver
```java
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
// 订阅主题
this.subject.attach(this);
}
@Override
public void update() {
String result = Integer.toBinaryString(this.subject.getState());
System.out.println("二进制的数据被更新为: "+result);
}
}
HexObserver
public class HexObserver extends Observer {
public HexObserver(Subject subject) {
this.subject = subject;
// add observer to Subject
this.subject.attach(this);
}
@Override
public void update() {
String result = Integer.toHexString(this.subject.getState());
System.out.println("十六进制数据被更新为:"+result);
}
}
调用
public class ObserverPatternTest {
public static void main(String[] args) {
Subject subject = new Subject();
HexObserver hexObserver = new HexObserver(subject);
BinaryObserver binaryObserver = new BinaryObserver(subject);
subject.setState(16);
//十六进制数据被更新为:10
//二进制的数据被更新为: 10000
}
}
调用过程