介绍
观察者属于行为模式,当一个对象改变时,会通知订阅者做相应的处理。 是一种低耦合的方式,观察者和被观察者者之间不互相依赖。 缺点或者说需要注意的点:1、如果观察者很多,要通知所有的观察者需要很多时间 2、观察者之间互相循环调用,会导致系统崩溃。
Demo
1、定义一个被观察者
代码语言:javascript复制public class Subject {
//监控的状态
private Integer state;
//维护所有观察者的列表
private List<Observer> observerList = new ArrayList<>();
public Integer getState() {
return state;
}
//状态被改变 通知所有的观察者
public void setState(Integer state) {
this.state = state;
notifyAllObserver();
}
public void attach(Observer observer) {
observerList.add(observer);
}
//通知
public void notifyAllObserver() {
observerList.forEach(Observer::update);
}
}
2、定义多个观察者
代码语言:javascript复制/**
* 二进制观察者
*/
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
void update() {
System.out.println("BinaryObserver :" Integer.toBinaryString(subject.getState()));
}
}
代码语言:javascript复制/**
* 八进制观察者
*/
public class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
void update() {
System.out.println("OctalObserver :" Integer.toOctalString(subject.getState()));
}
}
代码语言:javascript复制/**
* 十六进制观察者
*/
public class HexObserver extends Observer {
public HexObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
void update() {
System.out.println("HexObserver :" Integer.toHexString(subject.getState()));
}
}
3、执行
代码语言:javascript复制public class ObserverPatternTest {
public static void main(String[] args) {
Subject subject = new Subject();
new BinaryObserver(subject);
new HexObserver(subject);
new OctalObserver(subject);
subject.setState(10);
subject.setState(15);
}
}
4、执行结果
image.png